Maven-禁止显示[警告] JAR将为空-pom.xml中未标记任何内容

时间:2018-07-28 10:50:22

标签: java maven junit

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

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

编辑:

-q禁止显示警告时,是否可以在pom.xml中以编程方式进行跟踪?

6 个答案:

答案 0 :(得分:3)

警告实际上是基于是否可以找到配置的<classesDirectory>-默认情况下为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>

答案 1 :(得分:2)

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

解决方案1:

set mark-directories
set completion-ignore-case on
set show-all-if-ambiguous on
TAB: menu-complete
"\e[Z": "\e-1\C-i"

解决方案2:

由于上面的方法实质上创建了一个空的JAR(并且我确实不想包含测试类和测试资源),所以我选择“跳过” JAR的创建。

What is the best way to avoid maven-jar?

<!-- 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 :(得分:1)

其他解决方案似乎都不吸引我,因此我的解决方案是添加一个包含说明的文件src/main/resources/dummy

Dummy file to avoid empty jar warning from Maven.

至少这不会在pom.xml中产生任何噪音,并且不会对文件的用途产生任何误解。它会产生一个带有该文件的jar文件,但这对我来说不是问题。

答案 3 :(得分:0)

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

从用户的角度来看,它将只是jar文件,您应在其中定义<scope>test</scope>

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

答案 4 :(得分:0)

如果您要做的只是收集依赖关系,则可以添加<packaging>pom</packaging>来更改默认的jar包装。

但是,基于问题的上下文,拥有src / test / java和src / test / resources文件夹会使我相信您拥有一个仅是测试的组件?将包装更改为pom将阻止从Maven运行测试。如果确实是您的用例,则似乎您正在尝试跳过包装。最好的方法是将模块包装的插件绑定到无阶段,因为没有办法跳过Maven生命周期的包装阶段。这在上面被标识为解决方案1。

答案 5 :(得分:0)

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

    <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一样,不建议使用<packaging>pom</packaging>
除非pom唯一要做的就是收集依赖项。
否则,如果您有测试,则会在没有警告的情况下跳过这些测试,这不是您想要的。