Аргумент bean не должен быть пустым при упаковке DeltaSpike & Weld SE в виде uber-jar.

Я пытаюсь упаковать приложение командной строки, используя CDI, DeltaSpike (для начальной загрузки) с Weld SE в качестве реализации CDI. Приложение работает нормально при запуске из моей IDE, но я получаю тупое сообщение об ошибке при упаковке приложения в uber-jar:

Exception in thread "main" org.jboss.weld.exceptions.IllegalArgumentException: WELD-001456: Argument bean must not be null
at org.jboss.weld.util.Preconditions.checkArgumentNotNull(Preconditions.java:40)
at org.jboss.weld.manager.BeanManagerImpl.getReference(BeanManagerImpl.java:772)
at org.jboss.weld.util.ForwardingBeanManager.getReference(ForwardingBeanManager.java:61)
at org.jboss.weld.bean.builtin.BeanManagerProxy.getReference(BeanManagerProxy.java:85)
at org.apache.deltaspike.cdise.weld.WeldContainerControl.getContextControl(WeldContainerControl.java:138)
at com.katalystdm.sql.exec.CDIBootstrap.boot(CDIBootstrap.java:13)
at com.katalystdm.sql.exec.Main.main(Main.java:44)

Вот конфиг maven-shade-plugin:

  <plugin>
    <artifactId>maven-shade-plugin</artifactId>
    <configuration>
      <createDependencyReducedPom>false</createDependencyReducedPom>
      <filters>
        <filter>
          <artifact>*:*</artifact>
          <excludes>
            <exclude>**/LICENSE*</exclude>
            <exclude>**/NOTICE*</exclude>
          </excludes>
        </filter>
      </filters>
      <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
    </configuration>
    <executions>
      <execution>
        <phase>package</phase>
        <goals>
          <goal>shade</goal>
        </goals>
      </execution>
    </executions>
  </plugin>

Функция boot() проста:

public static <T> T boot(CdiContainer container, Class<T> clazz)
{
  container.boot();

  ContextControl contextControl = container.getContextControl(); // <-- Exception thrown here!
  contextControl.startContexts();

  return BeanProvider.getContextualReference(clazz, false);
}

Учитывая, что это работает при запуске из IDE, это должна быть проблема с упаковкой, но я не понимаю, в чем может быть причина.

Одним из отличий может быть то, что CDI обнаруживает при сканировании bean-компонентов. В моем beans.xml я исключаю практически все пакеты, кроме моего собственного приложения:

<?xml version="1.0" encoding="UTF-8"?>
<beans 
  xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
  xmlns:weld="http://jboss.org/schema/weld/beans" 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
  version="1.1" 
  bean-discovery-mode="all">
  <scan>
    <exclude name="com.beust.**"/>
    <exclude name="com.google.**"/>
    <exclude name="com.opencsv.**"/>
    <exclude name="javax.**"/>
    <exclude name="oracle.**"/>
    <exclude name="org.**"/>
  </scan>  
</beans>

Любые идеи о том, куда двигаться дальше?


person Yeroc    schedule 16.03.2017    source источник


Ответы (1)


Я обнаружил решение проблемы. Проблема в том, что исключения, определенные в файле beans.xml, были слишком широкими. Я исключил все под org.** из-за нескольких зависимых библиотек, которые вызывали ошибки CDI при сканировании. В частности, важно, чтобы пакеты org.apache.deltaspike сканировались CDI. В моем конкретном случае рабочий beans.xml выглядел так:

<?xml version="1.0" encoding="UTF-8"?>
<beans 
  xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
  xmlns:weld="http://jboss.org/schema/weld/beans" 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
  version="1.1" 
  bean-discovery-mode="all">
  <scan>
    <exclude name="com.beust.**"/>
    <exclude name="com.google.**"/>
    <exclude name="com.kelman.**"/>
    <exclude name="com.opencsv.**"/>
    <exclude name="javax.**"/>
    <exclude name="oracle.**"/>
    <exclude name="org.apache.commons.**"/>
    <exclude name="org.honton.**"/>
    <exclude name="org.jboss.**"/>
    <exclude name="org.skife.**"/>
    <exclude name="org.slf4j.**"/>
  </scan>  
</beans>
person Yeroc    schedule 16.03.2017