Исключение пакета с плагином maven-compiler-plugin работает для одного пакета, но не работает для другого

Мой проект имеет следующую структуру пакета:

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, которые использовались в других пакетах. Я проверю свою догадку.


person Leem.fin    schedule 15.08.2014    source источник
comment
вы уверены, что у вас чистая сборка?   -  person Adrian Shum    schedule 15.08.2014
comment
@AdrianShum, я всегда использую mvn clean install   -  person Leem.fin    schedule 15.08.2014
comment
Я пробовал подобный случай, и это сработало для меня хорошо. Maven 3.0.5, плагин компилятора 2.3.2.   -  person Adrian Shum    schedule 15.08.2014
comment
Я чувствую, что это может быть связано с тем, что пакет, который я пытался исключить, содержит классы Java, которые использовались в другом пакете.   -  person Leem.fin    schedule 15.08.2014


Ответы (3)


Хорошо, я нашел причину, по которой исключение не работает.

Потому что некоторые классы Java в пакете, который я пытался исключить, использовались в других пакетах. Кажется, плагин maven-compiler-plugin способен это обнаружить.

person Leem.fin    schedule 15.08.2014
comment
Это поведение компилятора Java по умолчанию, которое работает именно так. - person khmarbaise; 15.08.2014
comment
Есть ли способ принудительно исключить? - person Linuslabo; 21.04.2016
comment
@Linuslabo, вместо этого настройте свои исключения в maven-jar-plugin. - person Siggen; 02.07.2019
comment
Хотя попробовать определенно стоило. Возможно, это было бы полезно, чтобы исключить что-то из сканирования сонара? - person djangofan; 22.05.2020

Как вы заметили, проблема заключается в том, что ваши другие источники зависят от некоторых исключенных вами источников: поскольку 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 и это подробное объяснение того, как javac обрабатывает -sourcepath и другие аргументы.

person Chris Povirk    schedule 08.12.2020

настройка исключения в jar или плагинах war кажется хорошим методом, чтобы не мешать тестированию и компиляции 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>
person Andreas Covidiot    schedule 27.04.2021