[英]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.