我有一个 Java EE 项目。该项目使用 Maven 构建为 .ear 存档。有一个包含JPA 2持久单元的库jar,它位于ear的库目录中(因此多个其他模块可以使用它)。
在将 Shiro 的 Permission 接口的实现添加为该持久性单元中的实体时,我在正确部署 Ear 时遇到了困难,因为 Shiro 类在持久性单元中不可用。我最终发现我需要将库 jar 的所有依赖项(也适用于传递依赖项)放入库目录中才能部署它。
所以最终的布局大致如下:
ear
`- lib
`- persistence-unit.jar
- shiro-core.jar
- slf4j-api.jar
- module1
- moduleN
- library1.jar
- libraryN.jar
现在,对于问题:
- 对于应该放在库目录中的内容是否有任何指南,我的解决方案通常可以接受吗?
- 为什么 lib 目录中的 jar 无法使用 Ear 根目录中的库?
- 为什么 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>
对于持久性单元:
<?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>
对于应该放在库目录中的内容是否有任何指南,我的解决方案通常可以接受吗?
您已经基本搞定了,所有 EAR 模块都可用的 JAR 应该放在此处。
为什么 lib 目录中的 jar 无法使用 Ear 根目录中的库?
它通常以相反的方式工作,JAR 位于lib
文件夹可供根目录中的文件夹使用。但是,我相信您可以通过使用来实现这一目标<includeInApplicationXml>
:
<jarModule>
<groupId>org.nisse</groupId>
<artifactId>hue</artifactId>
<includeInApplicationXml>true</includeInApplicationXml>
</jarModule>
为什么 Maven 不自动解决这个问题?
我假设你的意思是maven不会自动将所有传递依赖项放入lib
?我相信它应该可以,并且确实 - 你能展示你的 POM 的相关部分吗?
Edit:您的 EAR 模块应该仅引用 EJB JAR 和 WAR 作为依赖项。默认情况下,任何传递依赖项都应自动包含在 EAR 中,位于顶层 - 这可以用<defaultLibBundleDir>
耳内标签插件<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.
还有<archive>
/<addClasspath>
部分应确保 MANIFEST 类路径设置正确。也许这正是您所缺少的?
Cheers,
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)