使用 maven-compiler-plugin 排除包适用于一个包,但不适用于另一个包
Posted
技术标签:
【中文标题】使用 maven-compiler-plugin 排除包适用于一个包,但不适用于另一个包【英文标题】:Excluding package with maven-compiler-plugin works for one package but doesn't work for another 【发布时间】:2014-10-09 00:03:44 【问题描述】:我的项目有以下包结构:
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
但保留 pacakge com.my.app.school.course.free
,如何实现?
========更新========
我觉得可能是因为我试图排除的包包含已在其他包中使用的 java 类。我会验证我的猜测。
【问题讨论】:
你确定你有干净的构建吗? @AdrianShum,我总是使用“mvn clean install”运行 我尝试了一个类似的案例,它对我来说效果很好。 Maven 3.0.5,编译器插件 2.3.2。 我觉得可能是因为我试图排除的包包含已在其他包中使用的java类。 【参考方案1】:好的,我找到了排除不起作用的原因。
因为我试图排除的包下的一些java类已在其他包中使用。似乎 maven-compiler-plugin 很聪明地检测到这一点。
【讨论】:
这是 java 编译器的默认行为,其工作方式与此完全相同。 有没有办法强制排除? @Linuslabo,改为在 maven-jar-plugin 中配置您的排除项。 绝对值得一试。这可能有助于从声纳扫描中排除某些东西?【参考方案2】:正如您所注意到的,问题在于您的 other 源依赖于您已排除的一些源:因为 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>
请参阅 MCOMPILER-174 和 this longer explanation of how javac handles -sourcepath
and other arguments。
【讨论】:
【参考方案3】:在 jar 或 war 插件 中配置 exclusion 似乎是一种不干扰 JUnit 的好方法测试和编译:
maven-jar-plugin
/ exclude
<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>
maven-war-plugin
/ exclude
<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>
【讨论】:
以上是关于使用 maven-compiler-plugin 排除包适用于一个包,但不适用于另一个包的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 maven-compiler-plugin 配置 Lombok?
Maven系列--"maven-compiler-plugin"的使用
Maven系列--"maven-compiler-plugin"的使用