【问题标题】:Maven project build into jar and warMaven项目构建成jar和war
【发布时间】:2017-10-13 19:19:23
【问题描述】:

我有一个带有以下 pom.xml 的项目,并且我已经从中删除了一些不需要的东西。我打算生成一个 jar 文件并最终生成一个 war 包,其中包含 jar 文件作为库。不幸的是,以下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>
    <artifactId>test</artifactId>
    <groupId>com.test.abcd</groupId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>
    <name>Test Application</name>

    ....

    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>${maven-compiler-plugin.version}</version>
            <configuration>
                <annotationProcessorPaths>
                    <path>
                        <groupId>org.mapstruct</groupId>
                        <artifactId>mapstruct-processor</artifactId>
                        <version>${mapstruct.version}</version>
                    </path>
                </annotationProcessorPaths>
            </configuration>
        </plugin>

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <configuration>
                <warSourceDirectory>target/www/</warSourceDirectory>
            </configuration>
            <executions>
                <execution>
                    <id>build-war-in-classes</id>
                    <phase>package</phase>
                    <goals>
                        <goal>war</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>

</project>

尽管这会在打包阶段同时生成 jarwar,但 war 不包含 jar 文件 (WEB-INF/lib/test-0.0.1-SNAPSHOT.jar) 作为库,而是我看到以下类,

META-INF/
META-INF/MANIFEST.MF
....
WEB-INF/
WEB-INF/classes/
....

什么可能导致这种行为?

【问题讨论】:

    标签: jar maven-3 war


    【解决方案1】:

    我认为您在 war 插件配置中缺少一个 conf 标志:

            <configuration>
              <archiveClasses>true</archiveClasses>
            </configuration>
    

    引用https://maven.apache.org/plugins/maven-war-plugin/faq.html

    如何在我的 web 应用中创建一个包含类的 JAR?

    如果您只想将类和资源打包为 WEB-INF/lib 中的 JAR,而不是 WEB-INF/classes 下的松散文件, 使用以下配置:

              <plugin>
                <artifactId>maven-war-plugin</artifactId>
                <version>3.1.0</version>
                <configuration>
                  <archiveClasses>true</archiveClasses>
                </configuration>
              </plugin>
    

    【讨论】:

    • 我见过这个标志......不幸的是,如果我想用 proguard 或其他东西混淆 jar 文件,这对我没有任何好处。你知道的还有其他方法吗?
    • 我看到了另外两种可能的策略:(1)按照我上面的建议做,但只创建爆炸战争(即没有存档);然后在稍后阶段,在 maven-war-plugin 输出(WEB-INF/lib 文件夹)上运行混淆插件。 (2)不要按照我上面的建议去做;构建 jar,对其进行混淆,然后配置 maven-war-plugin 以包含自定义 jar 文件(或其他 Web 资源),其中包含您的混淆 jar,并且仅在此之后,运行一些插件来归档您的分解 jar。如果您选择(2),我可以编辑我的答案以提供示例。
    • (2) 肯定会有所帮助,而我所追求的正是我所追求的......如果你有这方面的东西会很好。使用(1),我想我可以运行 maven-war-plugin 两次,但这是最佳实践吗?
    • 嗯,(2)确实稍微好一点;但是(1)并不一定意味着您需要运行 maven-war-plugin 两次。您可以为此使用一些 zip 插件(只知道存档文件夹)。或 maven 程序集插件。我可以在几个小时内展示 (2) 的示例。
    • ...在 SO 上的快速搜索表明您可以像这样在 war 插件中轻松包含静态资源(即像对待 JS 文件一样对待您的 jar,并将其作为静态资源包含在内) . &lt;artifactId&gt;maven-war-plugin&lt;/artifactId&gt; &lt;configuration&gt; &lt;webResources&gt; &lt;resource&gt; &lt;directory&gt;C:\\JAR&lt;/directory&gt; &lt;targetPath&gt;WEB-INF/lib&lt;/targetPath&gt; &lt;/resource&gt; &lt;/webResources&gt; &lt;/configuration&gt; 所以基本上这将是您构建中唯一的额外步骤。
    猜你喜欢
    • 2012-06-07
    • 2014-02-05
    • 2016-04-22
    • 2020-03-09
    • 2016-05-01
    • 2014-10-06
    • 1970-01-01
    • 2012-04-28
    • 2013-02-03
    相关资源
    最近更新 更多