使用 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 。我只是将上面的&lt;exclude&gt; 标记替换 为值&lt;exclude&gt;**/com/my/app/school/course/*&lt;/exclude&gt;。我认为它也应该工作,但它没有!在 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】:

jarwar 插件 中配置 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-compiler-plugin的理解

Maven系列--"maven-compiler-plugin"的使用

Maven系列--"maven-compiler-plugin"的使用

使用 maven-compiler-plugin 排除包适用于一个包,但不适用于另一个包

致命错误编译:找不到tools.jar - maven-compiler-plugin