Я пытаюсь загрузить бины вне военного файла. Цель состоит в том, чтобы можно было изменить файл jar без нового файла war.
Мой файл war включает внешний jar в качестве предоставленной зависимости:
<dependency>
<groupId>com.lube</groupId>
<artifactId>foo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
Я добавил jar файл в папку applibs в каталоге домена (domain / lib / applibs) и заполнил поле библиотеки во время развертывания.
Кажется, что из этого jar-файла не загружаются bean-компоненты (внедрение невозможно), но можно использовать класс. (класс доступен в текущем загрузчике классов).
Если я внедряю что-то в класс из файла войны, я получаю следующее исключение UnsatisfiedResolutionException: WELD-001334: Unsatisfied dependencies for type XXX with qualifiers
Я использую Payara 4.1.2.174 , но он также не работает с payara 5.
Главный вопрос: можно ли загружать бины (ejb / cdi) вне войны? Я не нахожу никакого хорошего решения в сети.
PS: я не могу использовать микросервисы;)
Редактировать: Файл войны не не содержит файл jar. Файл jar в настоящее время находится в домене в каталоге / lib / applibs (я также проверил все остальные папки)
Команда, как я это сделал, была следующей asadmin add-library --type app C:\library.jar
The library.jar содержит только один CDI bean
@Model
public class CdiBean {
public void test() {
System.out.println("It works!");
}
}
и файл bean. xml. (resources / META-INF - я тоже тестировал без папки META-INF)
В файле WAR есть класс запуска, который пытается загрузить Bean.
@Singleton
@Startup
@TransactionManagement(value = javax.ejb.TransactionManagementType.BEAN)
public class AppStartup {
@PostConstruct
public void postConstruct() {
try {
System.out.println(CdiBean.class);
CDI.current().select(CdiBean.class).get().test();
} catch (Exception e) {
throw new IllegalStateException(e.getMessage(), e);
}
}
}
Вывод после развертывание войны составляет:
[2020-01-21T13:47:36.413+0100] [Payara 4.1] [INFO] [] [] [tid: _ThreadID=103 _ThreadName=admin-thread-pool::admin-listener(3)] [timeMillis: 1579610856413] [levelValue: 800] [[ class com.lube.CdiBean]]
[2020-01-21T13:47:36.474+0100] [Payara 4.1] [SEVERE] [] [javax.enterprise.system.tools.deployment.common] [tid: _ThreadID=103 _ThreadName=admin-thread-pool::admin-listener(3)] [timeMillis: 1579610856474] [levelValue: 1000] [[
Exception while invoking class org.glassfish.ejb.startup.EjbApplication start method
javax.ejb.EJBException: javax.ejb.CreateException: Initialization failed for Singleton AppStartup
...
Caused by: javax.ejb.CreateException: Initialization failed for Singleton AppStartup
at com.sun.ejb.containers.AbstractSingletonContainer.createSingletonEJB(AbstractSingletonContainer.java:553)
at com.sun.ejb.containers.AbstractSingletonContainer.access$000(AbstractSingletonContainer.java:82)
at com.sun.ejb.containers.AbstractSingletonContainer$SingletonContextFactory.create(AbstractSingletonContainer.java:723)
... 72 more
Caused by: java.lang.IllegalStateException: WELD-001334: Unsatisfied dependencies for type CdiBean with qualifiers
... 74 more
Caused by: org.jboss.weld.exceptions.UnsatisfiedResolutionException: WELD-001334: Unsatisfied dependencies for type CdiBean with qualifiers
... 102 more
]]