【问题标题】:Maven - Suppress [WARNING] JAR will be empty - no content was marked for inclusion in pom.xmlMaven - 禁止 [WARNING] JAR 将为空 - 没有内容被标记为包含在 pom.xml 中
【发布时间】:2019-01-05 07:50:21
【问题描述】:

我的 maven 项目有意只需要 src/test/javasrc/test/resources。删除 src/main/* 文件夹后,mvn verify 上出现了预期的警告:

[WARNING] JAR will be empty - no content was marked for inclusion!
[INFO] Building jar: D:\dev\java\my-project\target\my-project-0.0.1-SNAPSHOT.jar

除了在src/main/java 中有一个带有空main() 方法的类之外,如何抑制此警告?

编辑:

由于-q 抑制了警告,后续是否可以在pom.xml 中以编程方式完成?

【问题讨论】:

标签: java maven junit


【解决方案1】:

其他解决方案似乎都没有对我特别有吸引力,所以我的解决方案是添加一个包含解释的文件src/main/resources/dummy

Dummy file to avoid empty jar warning from Maven.

至少这不会在pom.xml中产生任何噪音,并且不会对文件的用途产生任何误解。它会生成一个包含该文件的 jar,但在我的情况下这没问题。

【讨论】:

    【解决方案2】:

    这是(在我看来)最干净的解决方案
    对于不包含生产代码但包含测试的项目:

        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-jar-plugin</artifactId>
                    <configuration>
                        <skipIfEmpty>true</skipIfEmpty>
                    </configuration>
                </plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-install-plugin</artifactId>
                    <configuration>
                        <skip>true</skip>
                    </configuration>
                </plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-deploy-plugin</artifactId>
                    <configuration>
                        <skip>true</skip>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    

    它表明你想要什么:

    • 跳过尝试将“无生产代码”打包到 jar 中
    • 不要尝试安装/部署不存在的 jar

    保持测试执行不变。


    就像@John Camerin 提到的,不建议使用&lt;packaging&gt;pom&lt;/packaging&gt;
    除非您的 pom 唯一应该做的就是收集依赖项。
    否则,如果您有测试,它们将在没有警告的情况下被跳过,这不是您想要的。

    【讨论】:

      【解决方案3】:

      如果您只想收集依赖项,您可以添加 &lt;packaging&gt;pom&lt;/packaging&gt; 以更改默认的 jar 包装。

      但是,根据您问题中的上下文,拥有 src/test/java 和 src/test/resources 文件夹让我相信您有一个只是测试的组件?将包装更改为 pom 将阻止从 maven 运行测试。如果这确实是您的用例,那么您似乎正在尝试跳过包装。实现这一点的最佳方法是将模块打包的插件绑定到无阶段,因为无法跳过 maven 生命周期的打包阶段。这被确定为上面的解决方案 1。

      【讨论】:

        【解决方案4】:

        两种解决方案都以编程方式抑制警告消息。

        解决方案 1:

        <!-- https://mvnrepository.com/artifact/org.apache.maven.plugins/maven-jar-plugin -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>3.1.0</version>
            <!-- Ignore src/main in JAR packaging -->
            <configuration>
                <classesDirectory>src</classesDirectory>
                <excludes>
                    <exclude>main</exclude>
                </excludes>
            </configuration>
        </plugin>
        

        解决方案 2:

        由于上述内容本质上创建了一个空 JAR(我并不想包含测试类和测试资源),因此我选择“跳过”创建 JAR。

        What is the best way to avoid maven-jar?

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>3.1.0</version>
            <executions>
                <execution>
                    <id>default-jar</id>
                    <phase>none</phase>
                </execution>
            </executions>
        </plugin>
        

        【讨论】:

        • 真的没有更简单的方法可以在 POM 中禁用它吗?考虑一个 JAR,其唯一目的是引入其他依赖项。我真的需要添加路径排除来删除禁用警告吗?
        • 你可以尝试添加一个空 main() 的类
        • 如果您禁用maven-jar-plugin,您可能需要禁用maven-install-plugin。否则,mvn install 将无法构建。
        【解决方案5】:

        简单且最佳的解决方案是将测试代码保留在src/main/java 中,是的,这不是错字。此外,如果它是一个测试框架,则测试框架本身必须具有测试,因此将生产代码的测试从用户的角度定位到src/main/javasrc/test/java 中的测试是有意义的。

        从用户的角度来看,它只是一个 jar 文件,您应该在其中定义 &lt;scope&gt;test&lt;/scope&gt;

        这将解决所有问题,无需任何补充配置和更改任何默认值且不违反约定。

        【讨论】:

        • 将代码放入src/main 并将依赖项设置为pom.xml 中的&lt;scope&gt;test&lt;/scope&gt; 会导致Eclipse 中无法解析的导入?
        • 测试在移动到src/main 后停止执行mvn verify。 cucumber-jvm 框架使用 JUnit 运行器,因此在放置在 src/test 下时会启动。
        【解决方案6】:

        警告实际上是根据是否能找到配置的&lt;classesDirectory&gt;——默认target\classes

        这意味着绕过警告的一种简单方法是将其指向另一个故意为空的目录:

        <build>
            <plugins>
                <plugin>
                    <artifactId>maven-jar-plugin</artifactId>
                    <configuration>
                        <classesDirectory>dummy</classesDirectory>
                    </configuration>
                </plugin>
            </plugins>
        </build>
        

        或者,为了避免需要空目录,从另一个目录中排除所有内容:

                <plugin>
                    <artifactId>maven-jar-plugin</artifactId>
                    <configuration>
                        <classesDirectory>src</classesDirectory>
                        <excludes>
                            <exclude>**</exclude>
                        </excludes>
                    </configuration>
                </plugin>
        

        【讨论】:

        • 我没有特别使用这个解决方案,但它让我知道了我想要实现的目标。已投票并标记为答案。
        • 与 SO 中的任何内容一样,带有解释原因的答案更有用。
        • 以两种方式违反配置范式的约定:首先更改默认目录布局并使用不是最好的 maven-jar-plugin 配置...
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-10
        • 1970-01-01
        相关资源
        最近更新 更多