Java 如何在EJB jar文件中包含jar依赖项?
我正在尝试部署一个web项目,它的Java 如何在EJB jar文件中包含jar依赖项?,java,jakarta-ee,log4j,ejb-3.0,Java,Jakarta Ee,Log4j,Ejb 3.0,我正在尝试部署一个web项目,它的web-INF/lib中有一个EJBJAR文件。此EJB在其构建路径中配置了对log4j(jar)的引用。当我将.ear文件与打包在Websphere Application Server 8.5.5中的web项目一起部署,并在其中启动servlet时,会出现以下错误: Error 500: javax.servlet.ServletException: SRVE0319E: For the [ServletPrueba] servlet, pe.com.pro
web-INF/lib
中有一个EJBJAR文件。此EJB在其构建路径中配置了对log4j(jar)的引用。当我将.ear文件与打包在Websphere Application Server 8.5.5中的web项目一起部署,并在其中启动servlet时,会出现以下错误:
Error 500: javax.servlet.ServletException: SRVE0319E: For the [ServletPrueba] servlet, pe.com.projectavalon.Servlet.ServletPrueba servlet class was found, but a resource injection failure has occurred.
我检查了日志,似乎找不到对“log4j.jar”的引用
[22/02/14 1:41:42:402 COT] 0000007c InjectionBind E CWNEN0030E: The @EJB factory encountered a problem getting the object instance pe.com.projectavalon.Servlet.ServletPrueba/prueba binding object. The exception message was: The EJB reference in the SampleWeb.war module of the SampleEAR application could not be resolved; nested exception is: com.ibm.ejs.container.ContainerEJBException: Unable to initialize deferred EJB.; nested exception is: com.ibm.ejs.container.ContainerException: Failed to start the Test component in the SampleWeb.war module of the SampleEAR application. : An operation in the enterprise bean constructor failed. It is recommended that component initialization logic be placed in a PostConstruct method instead of the bean class no-arg constructor.; nested exception is:
java.lang.NoClassDefFoundError: org/apache/log4j/Logger
[22/02/14 1:41:42:404 COT] 0000007c webapp E com.ibm.ws.webcontainer.webapp.WebApp logServletError SRVE0293E: [Servlet Error]-[ServletPrueba]: com.ibm.wsspi.injectionengine.InjectionException: Unable to obtain an instance for pe.com.projectavalon.Servlet.ServletPrueba/prueba: javax.ejb.EJBException: The EJB reference in the SampleWeb.war module of the SampleEAR application could not be resolved; nested exception is: com.ibm.ejs.container.ContainerEJBException: Unable to initialize deferred EJB.; nested exception is: com.ibm.ejs.container.ContainerException: Failed to start the Test component in the SampleWeb.war module of the SampleEAR application. : An operation in the enterprise bean constructor failed. It is recommended that component initialization logic be placed in a PostConstruct method instead of the bean class no-arg constructor.; nested exception is:
java.lang.NoClassDefFoundError: org/apache/log4j/Logger
at com.ibm.wsspi.injectionengine.InjectionBinding.getInjectionObject(InjectionBinding.java:1123)
at com.ibm.ws.ejb.injection.processor.EJBInjectionBinding.getInjectionObject(EJBInjectionBinding.java:1101)
at com.ibm.wsspi.injectionengine.InjectionBinding.getInjectableObject(InjectionBinding.java:1032)
at com.ibm.wsspi.injectionengine.InjectionTarget.inject(InjectionTarget.java:125)
at com.ibm.ws.injectionengine.AbstractInjectionEngine.inject(AbstractInjectionEngine.java:1065)
at com.ibm.ws.webcontainer.annotation.WASAnnotationHelper.inject(WASAnnotationHelper.java:380)
at com.ibm.ws.webcontainer.servlet.ServletWrapperImpl.createTarget(ServletWrapperImpl.java:261)
at com.ibm.ws.webcontainer.servlet.ServletWrapper$1.run(ServletWrapper.java:1486)
at com.ibm.ws.security.util.AccessController.doPrivileged(AccessController.java:118)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.loadServlet(ServletWrapper.java:1472)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:620)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:458)
at com.ibm.ws.webcontainer.servlet.ServletWrapperImpl.handleRequest(ServletWrapperImpl.java:178)
at com.ibm.ws.webcontainer.filter.WebAppFilterManager.invokeFilters(WebAppFilterManager.java:1032)
at com.ibm.ws.webcontainer.servlet.CacheServletWrapper.handleRequest(CacheServletWrapper.java:87)
at com.ibm.ws.webcontainer.WebContainer.handleRequest(WebContainer.java:909)
at com.ibm.ws.webcontainer.WSWebContainer.handleRequest(WSWebContainer.java:1662)
at com.ibm.ws.webcontainer.channel.WCChannelLink.ready(WCChannelLink.java:200)
at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleDiscrimination(HttpInboundLink.java:459)
at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleNewRequest(HttpInboundLink.java:526)
at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.processRequest(HttpInboundLink.java:312)
at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.ready(HttpInboundLink.java:283)
at com.ibm.ws.tcp.channel.impl.NewConnectionInitialReadCallback.sendToDiscriminators(NewConnectionInitialReadCallback.java:214)
at com.ibm.ws.tcp.channel.impl.NewConnectionInitialReadCallback.complete(NewConnectionInitialReadCallback.java:113)
at com.ibm.ws.tcp.channel.impl.AioReadCompletionListener.futureCompleted(AioReadCompletionListener.java:175)
at com.ibm.io.async.AbstractAsyncFuture.invokeCallback(AbstractAsyncFuture.java:217)
at com.ibm.io.async.AsyncChannelFuture.fireCompletionActions(AsyncChannelFuture.java:161)
at com.ibm.io.async.AsyncFuture.completed(AsyncFuture.java:138)
at com.ibm.io.async.ResultHandler.complete(ResultHandler.java:204)
at com.ibm.io.async.ResultHandler.runEventProcessingLoop(ResultHandler.java:775)
at com.ibm.io.async.ResultHandler$2.run(ResultHandler.java:905)
at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1862)
当我检查ejbjar文件时,我发现log4j不在那里。如何将log4j的jar包含在EJB jar文件中?您是否创建或生成了相应的
META-INF/MANIFEST.MF
在清单中,您还可以指定应该加载哪些JAR。要想让它起作用,你应该把罐子直接放在耳朵里
这有一个解决方案。如果您在
WEB-INF\lib
目录下有log4j.jar文件,那就更好了。然后,web应用程序和ejb应用程序代码库都可以使用它。为此,请确保在EJBJAR文件中有META-INF/MANIFEST.MF
文件,在类路径
条目下指定log4jJAR文件路径。请记住,路径必须是相对于您的ejbjar文件的
例如,在下面的结构中,您可以在MANIFEST.MF的类路径
条目中指定为lib/log4j.jar
WAR
|
-- WEB-INF
|
-- web.xml
|
-- classes
|
-- lib
|
-- ejb jar
| |
| |-- META-INF
| |
| -- MANIFEST.MF
|
|
|
|-- log4j.jar
(格式化没有手工输入的好)在应用程序服务器(环境>共享库)中设置一个共享库,并将所有jar放在该路径中。
您需要在web项目的Manifest.mf中提到您的JAR。清单文件的路径是WebContent>META-INF。非常适合。我有一些需要调整的地方,但是作为servlet的调用,效果非常好。谢谢格式也很清楚,不用担心=D