【问题标题】:How to create a jar from part of my project that is packaged as a war如何从打包为战争的项目的一部分创建一个 jar
【发布时间】:2012-09-16 14:32:00
【问题描述】:

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

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

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

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

【问题讨论】:

  • 一个 .jar == 一个二进制 .war == 一个 .zip 文件。相同的文件格式(Zip 压缩),不同的文件内容。所以是的,你绝对可以打包你的 .war。使用 Eclipse 或 NetBeans(我通常这样做),使用 Ant,或者在您的情况下使用 Maven。只需检查我引用的 Ant 和/或 Maven 链接。
  • 对,但我不想把战争中的所有东西都放在罐子里。我只想要一些特定的 java 包。

标签: java maven jar


【解决方案1】:

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

【讨论】:

  • 我忘了提到我发现了什么。请参阅上面我更新的问题。
【解决方案2】:

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

mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-webapp -DarchetypeArtifactId=maven-archetype-webapp

【讨论】:

  • 好吧,我有一个战争生成就好了。除此之外,我希望能够从一些特定的 java 包创建一个 jar 以用于 3rd 方集成。
【解决方案3】:

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

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

【讨论】:

  • 完全同意你的金属头! DNC253 > 尝试在另一个项目中扩展您的课程,并根据需要制作尽可能多的项目(这里三个)。
【解决方案4】:

您可以创建一个多模块项目,其中一个模块包含您的域类,另一个模块是您的 Web 应用程序。通过这样做,您的外部第 3 方 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>

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

通过这种方式,您可以解耦一些依赖关系,并且可以重用来自domain 模块的jar 文件。


最后,您还可以查看使用Overlays 来创建一个war,方法是用您自己的war 覆盖第三方war。我不知道这在您的设置中是否可行,但值得一看。我已经成功使用了。

【讨论】:

  • 喜欢 Metalhead,很好的答案。完全同意你的看法。
  • @Jean-RémyRevy 谢谢。我意识到我在您进行一些编辑的同时编辑了我的答案,现在您的答案消失了。您可以再次重新申请。
猜你喜欢
  • 2013-03-08
  • 2015-09-19
  • 2015-02-23
  • 2015-10-02
  • 2014-11-23
  • 2017-02-12
  • 1970-01-01
  • 1970-01-01
  • 2020-09-20
相关资源
最近更新 更多