Упаковка приложения Java SE со сваркой в ​​исполняемый файл Jar

Я получил следующее исключение при попытке запустить исполняемый файл jar JAVA SE из командной строки:

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, но после упаковки в банку я всегда получаю эту ошибку.

Вот мой плагин пакета 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(); 
//      }
//
//    }

(Я пробовал как прокомментированный, так и раскомментированный код, но все равно получаю ту же ошибку). Любая помощь будет отличной, я действительно пробовал все.


person Géraud Willing B-S    schedule 12.01.2017    source источник
comment
Это похоже на проблему с зависимостями, которую может предоставлять eclipse, но которая отсутствует при упаковке приложения. Проверьте, есть ли у вас некоторые зависимости, объявленные как предоставленные или необязательные и т. д.   -  person maress    schedule 12.01.2017
comment
Спасибо за ваш ответ, я думаю, что моя основная проблема: 'weld.environment.se.StartMain 2017-01-12 21:34:43 Версия INFO: 155 - WELD-000900: 2.4.1 (Final) Исключение в потоке main java .lang.IllegalStateException: WELD-ENV-002009: Контейнер Weld SE не может быть инициализирован — архивы bean-компонентов не найдены в org.jboss.weld.environment.se.Weld.createDeployment(Weld.java:722) в org.jboss.weld. environment.se.Weld.initialize(Weld.java:592) в org.jboss.weld.environment.se.StartMain.go(StartMain.java:44) в org.jboss.weld.environment.se.StartMain.main( StartMain.java:53)'   -  person Géraud Willing B-S    schedule 12.01.2017
comment
Я также проверил свои зависимости, и все кажется правильным ' ‹groupId›org.jboss.weld.se‹/groupId› ‹artifactId›weld-se-core‹/artifactId› ‹version›2.4.1.Final‹/version› ‹/dependency› ‹!-- mvnrepository.com/artifact/org. jboss.weld.se/weld-se --› ‹dependency› ‹groupId›org.jboss.weld.se‹/groupId› ‹artifactId›weld-se‹/artifactId› ‹version›2.3.3. Финал‹/версия› ‹/зависимость›'   -  person Géraud Willing B-S    schedule 12.01.2017
comment
Две вещи приходят на ум, не уверен, что является причиной. Во-первых, убедитесь, что ваш JAR содержит beans.xml (это может быть исключение, связанное с отсутствием архива bean-компонентов). Во-вторых, почему у вас две зависимости Weld и обе и разные версии?! Кроме того, вам не нужны оба, вы должны использовать только org.jboss.weld.se:weld-se, который является затененной версией weld-se-core.   -  person Siliarus    schedule 13.01.2017
comment
Вы были правы, проблема возникла из моего файла bean.xml. В моей банке не было моего файла bean.xml, поэтому я добавил один в банку с `bean-discovery-mode=annotated`, и теперь я могу успешно запустить свою банку. Здесь возникла еще одна проблема: моя программа вообще не запускается, я вижу в выводах консоли, что сварка успешно запускается и выключается сразу после того, как мой mainThread.run() не выполнялся. Вот вывод консоли: INFO WELD STATIC_INSTANCE инициализирован INFO Bootstrap: 245 — WELD-ENV-002001: Контейнер Weld SE STATIC_INSTANCE закрыт Контейнер Weld SE STATIC_INSTANCE закрыт хуком выключения   -  person Géraud Willing B-S    schedule 13.01.2017
comment
@GéraudWillingB-S, это еще одна проблема, ИМХО, вам следует обновить свой вопрос, чтобы он содержал новые детали. Потому что держать это в комментариях не очень читабельно.   -  person G. Demecki    schedule 25.01.2017


Ответы (1)


Пользователь Siliarus помог вам, спасибо ему.

Теперь вы столкнулись с другой проблемой. Приложение немедленно закрывается.
Это не странно — это происходит потому, что вы не используете событие ContainerInitialized. Если вы используете встроенный класс org.jboss.weld.environment.se.StartMain, то у вас должен быть простой bean-компонент, который наблюдает за событием ContainerInitialized.

В качестве альтернативы вы можете использовать класс Main, содержимое которого вы вставили выше. Для этого попросите maven-jar-plugin использовать ваш блестящий класс с методом main примерно так:

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

В случае других проблем, я рекомендую вам взглянуть на рабочие примеры использования Weld: https://github.com/weld/core/tree/master/examples.

Надеюсь, поможет.

person G. Demecki    schedule 25.01.2017