我在Eclipse中创建了一个EAR应用程序,以便在Glassfish 3.1中运行。使用的项目包括:BibliotecaEAR2
(主要的EAR。' Biblioteca' 表示'图书馆' ),{{ 1}}(使用EJB),BibliotecaEJB
(使用实体和DAO)和BibliotecaModel
(Web应用程序)。 BibliotecaWeb
具有以下结构:
application.xml
在BibliotecaWeb中,<?xml version="1.0" encoding="UTF-8"?>
<application xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/application_6.xsd" id="Application_ID" version="6">
<display-name>BibliotecaEAR2</display-name>
<module>
<web>
<web-uri>BibliotecaWeb.war</web-uri>
<context-root>biblioteca</context-root>
</web>
</module>
<module>
<ejb>BibliotecaEJB.jar</ejb>
</module>
</application>
写成:
META-INF/MANIFEST.MF
当我启动glassfish时,我收到此警告消息:
Manifest-Version: 1.0
Class-Path: lib/google/guava-18.0.jar
// other JARs in BibliotecaEAR2 project
BibliotecaEJB.jar
虽然它并没有阻止我运行应用程序,但我想消除它。
使用Google搜索PWC6351警告,我发现当在清单文件中找不到用过的JAR时会发生这种情况。但是,请求JAR不仅仅是一个外部库,而是同一个EAR中的子项目。我应该做任何其他配置吗?
谢谢,
Rafael Afonso
答案 0 :(得分:0)
来自Packaging libraries with EARs:
在EAR文件中打包应用程序时,库JAR需要 放在存档lib目录中(存档根目录下的jar文件) 不会添加到类路径中,因此可以从其他EAR中获取 伪影。)
将库放在&#34; / lib&#34; EAR的目录( 目录名称可以在application.xml中重写)将是可见的 没有进一步的所有子模块(JAR,WAR和RAR) 组态。无需在EAR清单中添加Class-Path条目。
事实上,您不需要引用lib
文件夹中的jar,如果您在EAR根级别引用jar,看起来它将无效,就像您的{{1} }。
如果您没有从WAR模块类到EJB模块类的真正依赖关系,您可以删除BibliotecaEJB.jar
中的所有条目,它应该可以正常工作。
如果你反而拥有从WAR到EJB的真正依赖关系,你可能需要考虑你的项目结构以及你是否真的需要一个EAR。您还可以将所有内容打包到一个WAR中。
如果当前的WAR类直接依赖于EJB模块中的类,那么使用带有WAR和EJB模块的EAR的正确方法需要一些工作:
<强> 1。步骤强>
您必须为所有&#34;服务&#34;创建接口。应该可用于Web应用程序(WAR)中的类的类。
这是一个简单的例子:
MANIFEST.MF
和
public interface FileService {
public void showFileInformation(File file);
}
<强> 2。步骤强>
下一步是将所有新接口打包到一个新jar中。您的模型罐看起来与此方法类似。如果不能将其用于此目的,请创建一个简单的Java应用程序项目,该项目将打包为jar并将所有接口放入此项目中。此jar必须位于EAR的@Stateless
@Local(FileService.class)
@Remote(FileService.class)
public class FileServiceImpl implements FileService {
@Override
public void showFileInformation(File file) {
// here
// is
// the
// real
// stuff
}
}
文件夹中。
lib
然后,您必须在WAR和EJB模块中为此新jar添加依赖项,以便它们可以找到接口类。
第3。步骤强>
可以将服务注入Web应用程序的托管类(以及其他服务类),如下所示:
BibliotecaEAR2
-- BibliotecaEJB
-- BibliotecaWeb
-- /lib/interfaces.jar
也许你已经有类似的东西,但它应该在@RequestScoped
public class FileHandler {
// make sure to use the interface
@EJB
FileService fileService;
}
没有任何条目的情况下工作。
另见:
答案 1 :(得分:0)
我遇到了类似的问题,并通过自定义模块位置解决了这个问题,比如
<?xml version="1.0" encoding="UTF-8"?>
<application xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/application_6.xsd" id="Application_ID" version="6">
<display-name>BibliotecaEAR2</display-name>
<module>
<web>
<web-uri>BibliotecaWeb.war</web-uri>
<context-root>biblioteca</context-root>
</web>
</module>
<module>
<ejb>BibliotecaEJB.jar</ejb>
<bundleDir>/lib</bundleDir> <!-- ADD THIS OPTION TO THE MODULE -->
</module>
</application>
此解决方案取自Maven EAR plugin documentation,它使用Maven 3语法,但我认为您也可以使用它(或者您可以迁移到Maven 3)。
希望有所帮助。