【发布时间】:2020-01-21 09:53:46
【问题描述】:
我正在尝试在 war 文件之外加载 bean。目标是应该可以在没有新的 war 文件的情况下更改 jar 文件。
我的 war 文件包含外部 jar 作为提供的依赖项:
<dependency>
<groupId>com.lube</groupId>
<artifactId>foo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
我将jar文件添加到域目录(domain/lib/applibs)的applibs文件夹中,并在部署时填写了库字段。
似乎没有从这个 jar 文件加载任何 bean(无法注入),但可以使用该类。 (该类在当前类加载器中可用)。
如果我从 war 文件的类中注入一些东西,我会得到以下异常
UnsatisfiedResolutionException: WELD-001334: Unsatisfied dependencies for type XXX with qualifiers
我正在使用 payara 4.1.2.174,但它也不适用于 payara 5。
主要问题是:是否可以在战争之外加载 bean (ejb/cdi)?我在网上找不到任何好的解决方案。
P.S.:我不能使用微服务 ;)
编辑: war 文件不包含 jar 文件。 jar 文件当前位于 /lib/applibs 下的域中(我也测试了所有其他文件夹)
我执行的命令如下asadmin add-library --type app C:\library.jar
library.jar 只包含一个 CDI bean
@Model
public class CdiBean {
public void test() {
System.out.println("It works!");
}
}
还有 beans.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
]]
【问题讨论】:
标签: java jakarta-ee cdi payara