[英]Excluding package with maven-compiler-plugin works for one package but doesn't work for another
我的項目具有以下包結構:
src/
com.my.app.school.course
-Course.java
...
com.my.app.school.course.free
-CourseFree.java
我使用 Maven 來構建項目,在我的 pom.xml 中,我定義了maven-compiler-plugin來測試排除一個包及其所有 java 類。
我首先嘗試以下方法來排除包com.my.app.school.course.free
:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<excludes>
<exclude>**/com/my/app/school/course/free/*</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
有用! 我的意思是在運行mvn clean install
, target/classes/ 下的最終構建沒有包com/my/app/school/course/free
。
然后,我嘗試排除包com.my.app.school.course
。 我只是將上面的<exclude>
標記替換為值<exclude>**/com/my/app/school/course/*</exclude>
。 我認為它也應該工作,但它沒有! 在 target/classes/ 我看到所有包,沒有包被排除在外。 為什么?
我想要實現的是排除包com.my.app.school.course
但保留com.my.app.school.course.free
,如何實現?
========更新========
我覺得可能是因為我試圖排除的包包含在其他包中使用過的 java 類。 我會驗證我的猜測。
好的,我找到了排除不起作用的原因。
因為我試圖排除的包下的一些java類已經在其他包中使用了。 似乎 maven-compiler-plugin 很聰明地檢測到這一點。
正如您所注意到的,問題在於您的其他來源依賴於您排除的一些來源:因為 Maven 將-sourcepath
傳遞給 javac,javac 可以找到並編譯那些“缺失”的來源。
如果您希望在這種情況下構建失敗,您可以為-sourcepath
明確指定一個虛擬值:
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<compilerArgs>
<arg>-sourcepath</arg>
<arg>doesnotexist</arg>
</compilerArgs>
</configuration>
</plugin>
在jar或war 插件中配置排除似乎是一種不干擾 JUnit 測試和編譯的好技術:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.2.0</version>
<configuration>
<excludes>
<exclude>**/service/*</exclude>
</excludes>
</configuration>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.3.1</version>
<configuration>
<packagingExcludes>
WEB-INF/lib/commons-logging-*.jar,
%regex[WEB-INF/lib/log4j-(?!over-slf4j).*.jar]
</packagingExcludes>
</configuration>
</plugin>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.