2016-06-16 5 views
0

мне нужно изменить значение классов, используемое Maven-компилятор-плагин для компиляции тестов и я не могу найти способ сделать это ...Maven Compiler Plugin: Как изменить значение classpath для testCompile?

Я прочитал:

Но эти решения не хорошо для меня.

Более точно, мы строим клиента банку, чтобы использовать этот API, и мы должны построить этот клиент дважды:

  • Один с источником & цель 1.8 для нового клиента
  • Один с источником & целевой 1,7 для клиента по-прежнему с помощью JDK7

Вот конфигурация Maven-компилятора-плагин в pluginManagement моего родителя POM:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-compiler-plugin</artifactId> 
    <version>3.5.1</version> 
    <configuration> 
     <includes> 
      <include>**/*.java</include> 
     </includes> 
     <target>1.8</target> 
     <source>1.8</source> 
     <fork>true</fork> 
     <encoding>UTF-8</encoding> 
    </configuration> 
    <executions> 
     <execution> 
      <id>jdk7</id> 
      <phase>none</phase> 
      <goals> 
       <goal>compile</goal> 
      </goals> 
      <configuration> 
       <source>1.7</source> 
       <target>1.7</target> 
       <fork>true</fork> 
       <outputDirectory>${project.build.directory}/classes/jdk7/</outputDirectory> 
      </configuration> 
     </execution> 
     <execution> 
      <id>jdk8</id> 
      <phase>none</phase> 
      <goals> 
       <goal>compile</goal> 
      </goals> 
      <configuration> 
       <fork>true</fork> 
       <outputDirectory>${project.build.directory}/classes/jdk8/</outputDirectory> 
      </configuration> 
     </execution> 
    </executions> 
</plugin> 

Фаза установлена ​​в «none», чтобы отключить эти исполнения по умолчанию и они выполняются только для клиента.

Это конфигурация моего клиента POM:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-compiler-plugin</artifactId> 
    <executions> 
     <execution> 
      <id>jdk7</id> 
      <phase>compile</phase> 
     </execution> 
     <execution> 
      <id>jdk8</id> 
      <phase>compile</phase> 
     </execution> 
     <execution> 
      <id>default-compile</id> 
      <phase>none</phase> 
     </execution> 
    </executions> 
</plugin> 

Как вы можете видеть, я отключил выполнение «по умолчанию компиляции», потому что она компилируется 3-го раза источник непосредственно в мишени/и это довольно грязно в моем случае. Я хочу только классы JDK7 в классах target/classes/jdk7 и JDK8 в target/classes/jdk8.

Проблема заключается в том, что исполнение "по умолчанию-testCompile" из Maven-компилятор-плагин использует для пути к классам является:

  • мишени/тест-классы
  • целевыми/классы
  • Все зависимости банка

Ошибка компиляции из-за того, что maven-compiler-plugin не ищет файлы классов в папке target/classes/jdk8.

Я пытался добавить compilerArguments & compilerArgs конфигурации, но он не работает ...

Как я добавить «целевой/классы/jdk8» или изменить «целевые/классы» на " target/classes/jdk8 "к пути к классам, используемому default-testCompile?

Примечание: Я знаю, что если я не отключу «компиляцию по умолчанию», он будет работать, потому что классы будут находиться в «target/classes», но я не хочу компилировать в 3 раза источники. .

+0

Являются ли классы действительно сгенерированы под 'target/classes/jdk7' (соответственно' jdk8')? 'maven-compiler-plugin' не имеет опции' '. Обычно это настраивается с атрибутом ''. – Tunaki

+0

Действительно, этот вариант не существует, но я нашел его на другом посту, и он работает хорошо. Я попытался добавить свойство «-d» в compilerArgs, но он не работал. –

+0

Хм. Используете ли вы профиль для переключения с JDK? Если да, можете ли вы опубликовать эту конфигурацию? – Tunaki

ответ

0

Вы можете использовать профили для использования в разных конфигурациях. Вы должны определить два профиля для использования конфигурации jdk8 и другой конфигурации jdk 7.Например:

<profiles> 
    <profile> 
     <id>jdk7</id> 
     <activation> 
      <property> 
       <name>jdk7</name> 
      </property> 
     </activation> 
     <build> 
      <plugins> 
       <plugin> 
        <groupId>org.apache.maven.plugins</groupId> 
        <artifactId>maven-compiler-plugin</artifactId> 
        <version>3.5.1</version> 
        <configuration> 
         <source>1.7</source> 
         <target>1.7</target> 
        </configuration> 
       </plugin> 
      </plugins> 
     </build> 
    </profile> 
    <profile> 
     <id>jdk8</id> 
     <activation> 
      <property> 
       <name>jdk8</name> 
      </property> 
     </activation> 
     <build> 
      <plugins> 
       <plugin> 
        <groupId>org.apache.maven.plugins</groupId> 
        <artifactId>maven-compiler-plugin</artifactId> 
        <version>3.5.1</version> 
        <configuration> 
         <source>1.8</source> 
         <target>1.8</target> 
        </configuration> 
       </plugin> 
      </plugins> 
     </build> 
    </profile> 
</profiles> 

Итак, если вы хотите построить с jdk7 просто позвонить с -P jdk7 и когда вы хотите построить с jdk8 вызова с -P jdk8. Например:

mvn clean install -P jdk7 
+0

Это, безусловно, будет работать, но это не то, что я хочу сделать. Моя цель состоит в том, чтобы построить 2 библиотеки клиентов в одной и той же сборке, поэтому мне нужно использовать две папки классов differents, отличную от ./target/classes. –

0

Единственный способ решить проблему - изменить плагин maven-compiler.

Я добавил свойство «дополнительные классовые элементы» в TestCompilerMojo.

В ближайшее время я сделаю запрос на оттяжку.