我是一个Maven新手,所以如果这是微不足道的话,我道歉。基本上,我正在开发一个webapp,我正在使用Maven来管理项目。我在我的pom.xml中有<packaging>war</packaging>
,所以当我运行mvn package
时,它会吐出一个war文件以在Web服务器上部署。
现在,作为此应用程序的一部分,我们正在使用作为战争交付给我们的第三方库,它将单独部署在Web服务器上。这场战争包括我们编码的一些自定义集成功能。对于持久性逻辑,我最初只是在这个集成代码中直接编写了一个存储库。当我发现我需要更多的持久性逻辑(超过基本的SELECT)时,我发现我想要使用在我们的应用程序代码中找到的存储库和域对象。因此,理想情况下,我希望能够将我们的核心软件包包装起来,然后在第三方战争中包含该jar,以便我可以在那里使用相同的功能。
我只是不知道如何设置pom.xml来告诉它我想要在这个jar中包含哪些包(如果需要,甚至只需要1个包),以及如何创建jar本身。有没有办法从一个项目中的特定包中生成一个罐子,该项目设置为将整个项目打包为战争?
我找到了有关Maven jar plugin的信息,但它说,“如果项目的包装设置为'jar',则只要它通过”包“阶段就会执行此插件。”我的项目中的包装没有设置为jar。还有一些方法可以使用这个插件吗?
答案 0 :(得分:5)
您可以创建一个多模块项目,其中一个模块包含您的域类,另一个模块是您的Web应用程序。通过这样做,您的外部第三方war
可以使用您的域类,只需包含jar
。
这是目录结构的简单概述:
. ├── pom.xml ├── domain | ├── pom.xml | └── src | └── main | └── java | └── com | └── stackoverflow | └── domain | ├── SomeDao.java | └── AnotherDao.java └── web ├── pom.xml └── src └── main ├── java | └── com | └── stackoverflow | └── web | └── SomeBackingBean.java └── webapp └── WEB-INF └── web.xml
<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>
<groupId>com.stackoverflow</groupId>
<artifactId>Q12576767</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<name>${project.artifactId}-${project.version}</name>
<modules>
<module>domain</module>
<module>web</module>
</modules>
<dependencyManagement>
<dependencies>
<!-- Inter-Module dependencies -->
<dependency>
<groupId>com.stackoverflow</groupId>
<artifactId>Q12576767-domain</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
<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>
<parent>
<groupId>com.stackoverflow</groupId>
<artifactId>Q12576767</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>Q12576767-domain</artifactId>
<name>${project.artifactId}-${project.version}</name>
</project>
<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>
<parent>
<groupId>com.stackoverflow</groupId>
<artifactId>Q12576767</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>Q12576767-web</artifactId>
<packaging>war</packaging>
<name>${project.artifactId}-${project.version}</name>
<dependencies>
<dependency>
<groupId>com.stackoverflow</groupId>
<artifactId>Q12576767-domain</artifactId>
</dependency>
</dependencies>
</project>
通过这种方式,您可以解耦某些依赖项,并可以重用jar
模块中的domain
文件。
最后,您可以使用Overlays通过将第三方war
与您自己的war
重叠来创建一个war
。我不知道你的设置是否可行,但值得一看。我成功地使用了它。
答案 1 :(得分:2)
我不认为你可以从一些软件包创建一个jar文件,因为pom文件属于一个java / web项目而不是java项目中的单个软件包。您可以创建一个名为eg xyz-common的新Java项目,该项目应具有将与其他war文件共享的代码。然后你可以简单地做mvn install,你的xyz-common jar将用一些版本创建。然后更新war文件的pom文件,该文件需要您的公共jar及其依赖项。
我假设您的java包在war文件中?如果是这样,最好创建一个新的java项目,不要将java代码与war文件紧密结合。在war文件中,只需提及jar文件的依赖关系。
答案 2 :(得分:0)
使用maven-jar-plugin,请参阅:
示例:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<includes>
<include>**/service/*</include>
</includes>
</configuration>
<executions>
<execution>
<id>make-a-jar</id>
<phase>compile</phase>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
答案 3 :(得分:0)
您是否尝试使用mvn archetype:generate
命令生成项目?它为战争包装的webapps构建了一个完整的项目结构:
mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-webapp -DarchetypeArtifactId=maven-archetype-webapp