如何从打包为战争的项目的一部分创建一个jar

时间:2012-09-25 05:38:15

标签: java maven jar

我是一个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。还有一些方法可以使用这个插件吗?

4 个答案:

答案 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

的pom.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>

域/ pom.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>

    <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>

网/ pom.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>

    <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