簡體   English   中英

Maven - 禁止 [警告] JAR 將為空 - 沒有內容被標記為包含在 pom.xml 中

[英]Maven - Suppress [WARNING] JAR will be empty - no content was marked for inclusion in pom.xml

我的 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中以編程方式完成,那么后續將是?

警告實際上是基於它是否可以找到配置的<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>

這是(據我所知)最干凈的解決方案
對於不包含生產代碼但包含測試的項目:

    <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 唯一應該做的就是收集依賴項。
否則,如果您有測試,它們將在沒有警告的情況下被跳過,這不是您想要的。

這兩種解決方案都以編程方式抑制了警告消息。

解決方案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 創建。

避免 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>

其他解決方案似乎都沒有對我特別有吸引力,所以我的解決方案是添加一個包含解釋的文件src/main/resources/dummy

Dummy file to avoid empty jar warning from Maven.

至少這不會在pom.xml產生任何噪音,並且不會對文件的用途產生任何誤解。 它生成一個包含該文件的 jar,但在我的情況下這沒有問題。

如果您要做的只是收集依賴項,則可以添加<packaging>pom</packaging>以更改默認的 jar 包裝。

但是,根據您問題中的上下文,擁有 src/test/java 和 src/test/resources 文件夾會讓我相信您有一個只是測試的組件? 將包裝更改為 pom 會阻止測試從 maven 運行。 如果這確實是您的用例,那么您似乎正在嘗試跳過包裝。 實現這一點的最佳方法是將模塊打包的插件綁定到無階段,因為無法跳過 Maven 生命周期的打包階段。 這被標識為上面的解決方案 1。

簡單而最好的解決方案是將測試代碼保存在src/main/java是的,這不是打字錯誤。 此外,如果它是一個測試框架,則測試框架本身必須有測試,因此從用戶的角度將生產代碼的測試定位到src/main/javasrc/test/java的測試是有意義的。

從用戶的角度來看,它只是一個 jar 文件,您應該在其中定義<scope>test</scope>

這將解決所有問題,無需任何補充配置,無需更改任何默認值,也不會違反約定。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM