Maven-suppress[警告]JAR将为空-未将任何内容标记为包含在pom.xml中

8ulbf1ek  于 2022-10-05  发布在  Maven
关注(0)|答案(6)|浏览(260)

我的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:devjavamy-projecttargetmy-project-0.0.1-SNAPSHOT.jar

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

编辑:

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

syqv5f0l

syqv5f0l1#

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

<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唯一应该做的就是收集依赖项。
否则,如果您有测试,它们将在没有警告的情况下被跳过,这不是您想要的。

更短的替代方案

其中一些配置参数绑定了用户属性

  • maven-jar-pluginskipIfEmpty参数遗憾地没有链接到任何用户属性
  • maven-install-pluginskip参数从maven.install.skip获取其值
  • maven-deploy-pluginskip参数从maven.deploy.skip获取其值

这意味着pom可以缩短到

<properties>
        <maven.install.skip>true</maven.install.skip>
        <maven.deploy.skip>true</maven.install.skip>
    </properties>

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

fzsnzjdm2#

该警告实际上是基于它是否可以找到配置的<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>
x6492ojm

x6492ojm3#

这两个解决方案都以编程方式隐藏了警告消息。

方案一:

<!-- 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>

方案二:

由于上面实际上创建了一个空的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>
lx0bsm1f

lx0bsm1f4#

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

Dummy file to avoid empty jar warning from Maven.

至少这不会在pom.xml中产生任何噪音,并且不会有任何关于文件用途的误解。它会生成一个包含该文件的JAR,但在我的例子中这不是问题。

7cjasjjr

7cjasjjr5#

如果您要做的只是收集依赖项,则可以添加<packaging>pom</packaging>以更改默认的JAR打包。

然而,根据您问题中的上下文,拥有src/test/Java和src/test/Resources文件夹会让我相信您的组件只是测试?将 Package 更改为POM将使测试无法从maven运行。如果这确实是您的用例,那么您似乎正在尝试跳过 Package 。实现这一点的最好方法是将模块打包的插件绑定到None阶段,因为没有办法跳过maven生命周期的包阶段。这被确定为上面的解决方案1。

sg3maiej

sg3maiej6#

最简单也是最好的解决方案是将测试代码保存在src/main/java中,是的,这不是一个打字错误。此外,如果它是测试框架,则测试框架本身必须具有测试,因此从用户的Angular 将生产性代码的测试定位到src/main/java和将测试定位到src/test/java是有意义的。

从用户的Angular 来看,它将只是您应该在其中定义<scope>test</scope>的JAR文件。

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

相关问题