次の構造の EAR ファイルがあります。
- ライブラリ
- jar.jar
- テスト1
- テスト2
- jar.jar
- ejb.jar
- Test1Impl
- 戦争.戦争
- Test2Impl
- テストサーブレット
jar.jar には 2 つのインターフェースが含まれています
- テスト1
- テスト2
TestServlet は、war.war に ejb.jar へのマニフェスト Class-Path エントリがある場合にのみ、Test1Impl に解決される Test1 を注入します。Test1Impl は、ejb.jar に war.war へのマニフェスト Class-Path エントリがある場合にのみ、Test2Impl に解決される Test2 を注入します。
ヒント エントリのMatching the classloader structure for deployment of Weld ドキュメントは、マニフェスト エントリが必要な理由を説明しています。このクロス BDA インジェクションはどのように正常に機能するはずですか? Class-Path マニフェスト エントリの追加は、実際には実装を表示したくないため、少しばかげているように思えます。他のサブデプロイメントの Bean が表示されるようにしたいだけです。それを行う方法はありますか?
ここでの実装
public class Test1Impl implements Test1 {
@Inject
private Test2 test2;
public void hello() {
System.out.println(test2.getString());
}
}
public class Test2Impl implements Test2 {
public String getString() {
return "Hello";
}
}
@WebServlet(urlPatterns = "/test")
public class TestServlet implements Servlet {
@Inject
private Test1 test;
public void init(ServletConfig config) throws ServletException {
}
public ServletConfig getServletConfig() {
return null;
}
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
test.hello();
}
public String getServletInfo() {
return null;
}
public void destroy() {
}
}
そして、ここで application.xml
<?xml version="1.0" encoding="UTF-8"?>
<application xmlns="http://xmlns.jcp.org/xml/ns/javaee"
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/application_7.xsd"
version="7">
<description>The EAR</description>
<display-name>ear</display-name>
<module>
<ejb>ejb.jar</ejb>
</module>
<module>
<web>
<web-uri>war.war</web-uri>
<context-root>/</context-root>
</web>
</module>
<library-directory>lib</library-directory>
</application>