5

我是 Maven 新手,所以如果这是微不足道的事情,我深表歉意。基本上,我正在开发一个 webapp,并且我正在使用 Maven 来管理项目。我<packaging>war</packaging>在我的 pom.xml 中,这样当我运行时mvn package,它会吐出一个 war 文件以部署在 Web 服务器上。

现在,作为这个应用程序的一部分,我们正在使用作为战争交付给我们的第 3 方库,它单独部署在 Web 服务器上。这场战争包括我们编写的一些自定义集成功能。对于持久性逻辑,我最初只是直接在此集成代码中编写了一个存储库。当我发现我需要更多的持久性逻辑(而不是基本的 SELECT)时,我发现我想要使用在我们的应用程序代码中找到的存储库和域对象。所以,理想情况下,我希望能够打包我们的核心包,然后将那个 jar 包含在这场 3rd 方战争中,这样我就可以在那里使用相同的功能。

我只是不知道如何设置 pom.xml 来告诉它我想要这个 jar 中的哪些包(或者如果需要,甚至只需要 1 个包),以及如何创建 jar 本身。有没有办法从项目中的特定包生成 jar,该项目设置为将整个项目打包为战争?

我找到了有关Maven jar 插件的信息,但它说:“如果您的项目的打包设置为 'jar',则只要通过“打包”阶段,就会执行此插件。” 我项目中的包装没有设置为 jar。还有什么方法可以使用这个插件吗?

4

4 回答 4

6

您可以创建一个多模块项目,其中一个模块包含您的域类,另一个模块是您的 Web 应用程序。通过这样做,您的外部第三方war可以使用您的域类,只需包含jar.

这是目录结构的简单概述:

.
├── pom.xml
├── 域名
| ├── pom.xml
| └── 源
| └── 主要
| └── java
| └── com
| └── 堆栈溢出
| └── 域名
| ├── SomeDao.java
| └── AnotherDao.java
└── 网络
    ├── pom.xml
    └── 源
        └── 主要
            ├── java
            | └── com
            | └── 堆栈溢出
            | └── 网络
            | └── SomeBackingBean.java
            └── 网页应用
                └── 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将 3rd-partywar与您自己的war. 我不知道这在您的设置中是否可行,但值得一看。我已经成功使用了它。

于 2012-09-25T07:22:27.430 回答
2

我不认为你可以从一些包创建一个 jar 文件,因为 pom 文件属于一个 java/web 项目,而不是 java 项目中的单个包。您可以创建一个名为例如 xyz-common 的新 java 项目,该项目应包含将与其他 war 文件共享的代码。然后您可以简单地执行 mvn install 并且您的 xyz-common jar 将使用某个版本创建。然后更新需要你的公共 jar 及其依赖项的 war 文件的 pom 文件。

我假设你的java包在war文件中?如果是这样,最好创建一个新的 java 项目,并且不要将 java 代码与 war 文件紧密耦合。在您的war文件中,只需提及您的jar文件的依赖关系。

于 2012-09-25T06:20:45.863 回答
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>
于 2012-09-25T05:42:00.917 回答
0

您是否尝试过使用mvn archetype:generate命令生成项目?它为您构建了一个完整的带有战争包装的 webapps 项目结构:

mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-webapp -DarchetypeArtifactId=maven-archetype-webapp
于 2012-09-25T05:53:21.990 回答