在java EE中,我应该将哪些jar放入库目录?

Sim*_*ren 11 ear classpath java-ee maven maven-ear-plugin

我有一个Java EE项目.该项目使用maven构建为.ear存档.有一个包含JPA 2持久性单元的库jar,它位于耳朵的库目录中(因此多个其他模块可以使用它).

虽然在这个持久性单元中添加了Shiro的Permission接口的实现作为实体,但我无法正确部署,因为shiro类在持久性单元中不可用.我最终发现我需要在库目录中放置库jar的所有依赖项(也适用于传递deps)以使其部署.

所以最终的布局看起来大致如下:

ear
`- lib
   `- persistence-unit.jar
    - shiro-core.jar
    - slf4j-api.jar
 - module1
 - moduleN
 - library1.jar
 - libraryN.jar
Run Code Online (Sandbox Code Playgroud)

现在,对于问题:

  1. 是否有任何指南应该放在库目录中,我的解决方案通常是否可以接受?
  2. 为什么lib目录中的jar中没有可用于耳根的库?
  3. 为什么maven不会自动解决这个问题?

编辑:耳朵的pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <artifactId>ear</artifactId>
    <packaging>ear</packaging>

    <parent>
        <groupId>com.example</groupId>
        <artifactId>project</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-ear-plugin</artifactId>
                <version>2.7</version>
                <configuration>
                    <modules>
                        <webModule>
                            <!-- ... -->
                        </webModule>
                        <ejbModule>
                            <!-- ... -->
                        </ejbModule>
                        <jarModule>
                            <groupId>com.example</groupId>
                            <artifactId>persistence-unit</artifactId>
                            <bundleDir>lib</bundleDir>
                        </jarModule>

                        <-- I added these to get the deployment working -->
                        <jarModule>
                            <groupId>org.apache.shiro</groupId>
                            <artifactId>shiro-core</artifactId>
                            <bundleDir>lib</bundleDir>
                        </jarModule>
                        <jarModule>
                            <groupId>org.slf4j</groupId>
                            <artifactId>slf4j-api</artifactId>
                            <bundleDir>lib</bundleDir>
                        </jarModule>
                    </modules>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <dependencies>
        <dependency>
            <groupId>com.example</groupId>
            <artifactId>persistence-unit</artifactId>
        </dependency>
        <dependency>
            <!-- ... -->
            <type>war</type>
        </dependency>
        <dependency>
            <!-- ... -->
            <type>ejb</type>
        </dependency>

        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-core</artifactId>
        </dependency>
    </dependencies>
</project>
Run Code Online (Sandbox Code Playgroud)

对于持久性单元:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <artifactId>persistence-unit</artifactId>
    <packaging>jar</packaging>

    <parent>
        <groupId>com.example</groupId>
        <artifactId>project</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.jboss.spec</groupId>
            <artifactId>jboss-javaee-6.0</artifactId>
            <type>pom</type>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-core</artifactId>
        </dependency>
    </dependencies>
</project>
Run Code Online (Sandbox Code Playgroud)

And*_*rup 8

是否有任何指南应该放在库目录中,我的解决方案通常是否可以接受?

你几乎已经钉了它,所有EAR模块应该可用的JAR应该放在这里.

为什么lib目录中的jar中没有可用于耳根的库?

它通常以相反的方式工作,文件lib夹中的JAR 可用于根目录中的JAR .但是,我相信您可以通过以下方式实现此目的<includeInApplicationXml>:

<jarModule>
    <groupId>org.nisse</groupId>
    <artifactId>hue</artifactId>
    <includeInApplicationXml>true</includeInApplicationXml>
</jarModule>
Run Code Online (Sandbox Code Playgroud)

为什么maven不会自动解决这个问题?

我假设您的意思是maven不会自动将所有传递依赖项置于其中lib?我相信它应该做,并且确实 - 你能展示你的POM的相关部分吗?

编辑:您的EAR模块应仅引用EJB JAR和WAR作为依赖项.任何传递依赖都应自动包含在EAR中,默认情况下位于顶层 - 这可以使用<defaultLibBundleDir>ear-plugin中的标记覆盖<configuration>:

<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-ear-plugin</artifactId>
<version>2.7</version>
<configuration>
    <defaultLibBundleDir>lib</defaultLibBundleDir>
    <archive>
        <manifest>
            <addClasspath>true</addClasspath>
        </manifest>
    </archive>
    <modules>
       ... etc.
Run Code Online (Sandbox Code Playgroud)

此外,<archive>/ <addClasspath>section应确保正确设置MANIFEST类路径.也许这正是你所缺少的?

干杯,


Jac*_*ski 6

我不会评论Maven的配置,而只是库应该去的地方.

在EAR模块中共享库有两种主要机制 - 捆绑库(在Java EE 6规范中的EE.8.2.1中描述)和安装库(EE.8.2.2).

已安装的库与EAR分开安装,因此在应用程序服务器上的许多EAR之间共享.

捆绑的库可以安装在lib(默认库目录),由library-directoryEAR的部署描述符的元素指定的目录中和/或在Class-Path模块的清单头部引用的任何目录中(或者由模块引用的jar) turn定义了一个传递库).

我对Java EE 6规范的理解是Class-Path可以引用EAR中任何位置的任何库,但是jar的内容就变成了非Java EE模块.这意味着persistence.xml在部署时不考虑该文件中定义的潜在持久性上下文在运行时不会生效.

在您的情况下,persistence-unit.jar似乎包含持久性单元配置,并使其可用于其他模块,它应放在lib目录中.另外两个jar - shiro-core.jarslf4j-api.jar- 可以在EAR中的任何位置(包括lib用于简单部署的目录 - 不需要Class-Path在任何引用库/模块中具有元素).

包装它以简化部署将您的库放在lib目录中,除非Class-Path使用它并指向另一个目录.在这种情况下,您宁愿检查引用jar文件是否不是具有持久性单元定义的Java EE jar,因为它将无法正确部署(并且PU将无法用于模块).