java - 将 Java SE 应用程序打包到可执行 Jar 中

标签 java maven cdi executable-jar weld-se

我在尝试从命令行运行 JAVA SE 可执行 jar 时遇到以下异常:

Exception in thread "main" org.jboss.weld.exceptions.DeploymentException: java.lang.Internand
    at org.jboss.weld.executor.AbstractExecutorServices.checkForExceptions(AbstractExec
    at org.jboss.weld.executor.AbstractExecutorServices.invokeAllAndCheckForExceptions()
    at org.jboss.weld.executor.AbstractExecutorServices.invokeAllAndCheckForExceptions()
    at org.jboss.weld.bootstrap.ConcurrentBeanDeployer.addClasses(ConcurrentBeanDeploye
    at org.jboss.weld.bootstrap.BeanDeployment.createClasses(BeanDeployment.java:203)
    at org.jboss.weld.bootstrap.WeldStartup.startInitialization(WeldStartup.java:374)
    at org.jboss.weld.bootstrap.WeldBootstrap.startInitialization(WeldBootstrap.java:76
    at org.jboss.weld.environment.se.Weld.initialize(Weld.java:556)
    at org.jboss.weld.environment.se.StartMain.go(StartMain.java:44)
    at org.jboss.weld.environment.se.StartMain.main(StartMain.java:53)
Caused by: com.google.common.util.concurrent.ExecutionError: java.lang.InternalError: Enclo at com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2197) at com.google.common.cache.LocalCache.get(LocalCache.java:3932) at com.google.common.cache.LocalCache.getOrLoad(LocalCache.java:3936) at com.google.common.cache.LocalCache$LocalLoadingCache.get(LocalCache.java:4806) at org.jboss.weld.util.cache.LoadingCacheUtils.getCacheValue(LoadingCacheUtils.java at org.jboss.weld.util.cache.LoadingCacheUtils.getCastCacheValue(LoadingCacheUtils. at org.jboss.weld.resources.ClassTransformer.getBackedAnnotatedType(ClassTransforme at org.jboss.weld.resources.ClassTransformer.getBackedAnnotatedType(ClassTransforme at org.jboss.weld.bootstrap.AnnotatedTypeLoader.loadAnnotatedType(AnnotatedTypeLoad at org.jboss.weld.bootstrap.AnnotatedTypeLoader.loadAnnotatedType(AnnotatedTypeLoad at org.jboss.weld.bootstrap.BeanDeployer.addClass(BeanDeployer.java:97) at org.jboss.weld.bootstrap.ConcurrentBeanDeployer$1.doWork(ConcurrentBeanDeployer. at org.jboss.weld.bootstrap.ConcurrentBeanDeployer$1.doWork(ConcurrentBeanDeployer. at org.jboss.weld.executor.IterativeWorkerTaskFactory$1.call(IterativeWorkerTaskFac at org.jboss.weld.executor.IterativeWorkerTaskFactory$1.call(IterativeWorkerTaskFac at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:745) Caused by: java.lang.InternalError: Enclosing method not found at java.lang.Class.getEnclosingMethod(Class.java:1065) at sun.reflect.generics.scope.ClassScope.computeEnclosingScope(ClassScope.java:50) at sun.reflect.generics.scope.AbstractScope.getEnclosingScope(AbstractScope.java:78 at sun.reflect.generics.scope.AbstractScope.lookup(AbstractScope.java:96) at sun.reflect.generics.scope.AbstractScope.lookup(AbstractScope.java:96) at sun.reflect.generics.scope.AbstractScope.lookup(AbstractScope.java:96) at sun.reflect.generics.scope.AbstractScope.lookup(AbstractScope.java:96) at sun.reflect.generics.factory.CoreReflectionFactory.findTypeVariable(CoreReflecti at sun.reflect.generics.visitor.Reifier.visitTypeVariableSignature(Reifier.java:165 at sun.reflect.generics.tree.TypeVariableSignature.accept(TypeVariableSignature.jav at sun.reflect.generics.repository.MethodRepository.getReturnType(MethodRepository. at java.lang.reflect.Method.getGenericReturnType(Method.java:255) at org.jboss.weld.annotated.slim.backed.BackedAnnotatedMethod.(BackedAnnotate at org.jboss.weld.annotated.slim.backed.BackedAnnotatedMethod.of(BackedAnnotatedMet at org.jboss.weld.annotated.slim.backed.BackedAnnotatedType$BackedAnnotatedMethods..java:195) at org.jboss.weld.annotated.slim.backed.BackedAnnotatedType$BackedAnnotatedMethods..java:188) at org.jboss.weld.util.LazyValueHolder.get(LazyValueHolder.java:35) at org.jboss.weld.annotated.slim.backed.BackedAnnotatedType$EagerlyInitializedLazyVdType.java:156) at org.jboss.weld.annotated.slim.backed.BackedAnnotatedType$BackedAnnotatedMethods.188) at org.jboss.weld.annotated.slim.backed.BackedAnnotatedType$BackedAnnotatedMethods.188) at org.jboss.weld.annotated.slim.backed.BackedAnnotatedType.(BackedAnnotatedT at org.jboss.weld.annotated.slim.backed.BackedAnnotatedType.of(BackedAnnotatedType. at org.jboss.weld.resources.ClassTransformer$TransformClassToBackedAnnotatedType.lo at org.jboss.weld.resources.ClassTransformer$TransformClassToBackedAnnotatedType.lo at com.google.common.cache.LocalCache$LoadingValueReference.loadFuture(LocalCache.j at com.google.common.cache.LocalCache$Segment.loadSync(LocalCache.java:2315) at com.google.common.cache.LocalCache$Segment.lockedGetOrLoad(LocalCache.java:2278) at com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2193) ... 18 more

但是,我能够在 Eclipse 中成功运行该程序,但一旦打包到 jar 中,我总是会遇到此错误。

这是我的 Maven 包插件:

     <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>single</goal>
            </goals>
          </execution>
        </executions>
        <configuration>
          <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
          </descriptorRefs>
        </configuration>
      </plugin>
 <!-- Build an executable JAR -->
    <plugin>
      <!-- Build an executable JAR -->
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-jar-plugin</artifactId>
      <configuration>
        <archive>
          <manifest>
            <addClasspath>true</addClasspath>
            <classpathPrefix>lib/</classpathPrefix>
            <mainClass>org.jboss.weld.environment.se.StartMain</mainClass>
          </manifest>
        </archive>
      </configuration>
    </plugin>
    </plugins>

这是我引导 Weld 的方法:

public  static void main(String[] args) {
    //Start CDI container
    WeldContainer weldContainer = WeldFactory.INSTANCE.getWeldContainer();

    try {
        MainThread mainExecutor = weldContainer.instance().select(MainThread.class).get(); 
        mainExecutor.run();
    } catch (Exception e) {
        LOG.error("Fatal error",e);
    }finally {
        //Shutdwon CDI container
        weldContainer.shutdown();   
    }

}

//  @Inject
//  MainThread mainExecutor;
//  
//    public void main(@Observes ContainerInitialized event){
//      try {
//          //MainThread mainExecutor = weldContainer.instance().select(MainThread.class).get(); 
//          mainExecutor.run();
//      } catch (Exception e) {
//          LOG.error("Fatal error",e);
//      }finally {
//          //Shutdwon CDI container
//          //weldContainer.shutdown(); 
//      }
//
//    }

(我尝试了注释和未注释的代码,但仍然遇到相同的错误)。 任何帮助都会很棒,我真的尝试了所有方法。

最佳答案

用户 Siliarus 帮助了您,为他点赞。

现在您遇到了另一个问题。应用程序立即关闭。
这并不奇怪 - 发生这种情况是因为您没有使用 ContainerInitialized事件。如果您使用的是内置org.jboss.weld.environment.se.StartMain类,那么你应该有一个简单的 bean 来观察 ContainerInitialized事件。

或者,您可以使用您在上面粘贴的内容 Main 类。为此,请指示 maven-jar-plugin使用 main 来使用你的 Shiny 类方法如下:

<mainClass>com.your.own.class.with.main.method</mainClass>

如果遇到其他问题,我鼓励您查看 Weld 用法的工作示例:https://github.com/weld/core/tree/master/examples .

希望有帮助。

关于java - 将 Java SE 应用程序打包到可执行 Jar 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41620135/

相关文章:

java - 尽管遵循格雷厄姆扫描,但在凸包上产生了错误点

maven - 带有 Maven Jetty 插件的静态内容

Android Studio gradle sync,尝试错误下载jar而不是aar

Maven 原型(prototype) - 可选属性,默认为空

java - Java程序中如何获取环境变量(被外部修改)的修改值?

java - Android-从特定目录打开

java - 需要Java的 "more precise rethrow in exceptions"

java - 有没有办法知道是否有CDI事件的观察者?

java - 每次事件发生时都会调用@PostConstruct

java - 打包为 EAR 时是否可以在 WAR 中观察 CDI 事件