2015-12-23 2 views
3

Я работаю над смешанным проектом java и kotlin, используя maven.как указать maven компилятор плагин заказывать

Проблема, с которой я столкнулся сейчас, - maven-compiler-plugin работает до компиляции kotlin-maven-plugin.

[INFO] --- maven-compiler-plugin:3.0:compile (default-compile) @annotation --- 
[INFO] Changes detected - recompiling the module! 
[INFO] Compiling 11 source files to /Users/hannes/workspace/tikxml/annotation/target/classes 
[INFO] --- kotlin-maven-plugin:1.0.0-beta-4583:compile (compile) @ annotation 
[INFO] Kotlin Compiler version 1.0.0-beta-4583 

В моем исходном коде java я ссылаюсь на классы, написанные в kotlin. Но javac бежит до котлинка. Следовательно, maven прерывает ошибки компилятора.

Мой П (родитель П, я использую подмодули) выглядит следующим образом:

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <parent> 
     <groupId>org.sonatype.oss</groupId> 
     <artifactId>oss-parent</artifactId> 
     <version>7</version> 
    </parent> 

    ... 

    <modules> 
     <module>core</module> 
     <module>annotation</module> 
     <module>processor</module> 
    </modules> 


    <properties> 
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
     <java.version>1.7</java.version> 
     <kotlin.version>1.0.0-beta-4583</kotlin.version> 
    </properties> 


    <build> 
     <pluginManagement> 
      <plugins> 

       <plugin> 
        <groupId>org.apache.maven.plugins</groupId> 
        <artifactId>maven-compiler-plugin</artifactId> 
        <version>3.0</version> 
        <configuration> 
         <source>${java.version}</source> 
         <target>${java.version}</target> 
        </configuration> 
       </plugin> 
      </plugins> 


     </pluginManagement> 

     <plugins> 

      <plugin> 
       <groupId>org.jetbrains.kotlin</groupId> 
       <artifactId>kotlin-maven-plugin</artifactId> 
       <version>${kotlin.version}</version> 
       <executions> 
        <execution> 
         <id>compile</id> 
         <phase>compile</phase> 
         <goals> 
          <goal>compile</goal> 
         </goals> 
         <configuration> 
          <sourceDirs> 
           <source>src/main/java</source> 
          </sourceDirs> 
         </configuration> 
        </execution> 
        <execution> 
         <id>test-compile</id> 
         <phase>test-compile</phase> 
         <goals> 
          <goal>test-compile</goal> 
         </goals> 
         <configuration> 
          <sourceDirs> 
           <source>src/test/java</source> 
          </sourceDirs> 
         </configuration> 
        </execution> 
       </executions> 
      </plugin> 

     </plugins> 
    </build> 

</project> 
+0

Что делать, если вы добавляете элемент плагина 'maven-compiler-plugin' сразу после' kotlin-maven-plugin'? –

ответ

5

В документации Kotlin по адресу Using Maven предлагается явно привязать исполнение kotlin-maven-plugin к фазе process-sources. Так как maven-compiler-plugin связан с фазой compile, привязка kotlin-maven-plugin к фазе process-sources делает ее первой.

<plugin> 
    <artifactId>kotlin-maven-plugin</artifactId> 
    <groupId>org.jetbrains.kotlin</groupId> 
    <version>${kotlin.version}</version> 

    <executions> 
     <execution> 
      <id>compile</id> 
      <phase>process-sources</phase> 
      <goals> <goal>compile</goal> </goals> 
     </execution> 

     <execution> 
      <id>test-compile</id> 
      <phase>process-test-sources</phase> 
      <goals> <goal>test-compile</goal> </goals> 
     </execution> 
    </executions> 
</plugin> 
1

Простое, но эффективное решение было бы изменить две фазы (<phase> элемента), примененной к казням котлинского Maven Плагин от compile до process-sources и от test-compile до process-test-sources.

Вы хотите, чтобы часть Kotlin была выполнена до Java. Maven по умолчанию будет ссылаться на Maven Compiler Plugin как часть фазы compile для исходного кода и test-compile для тестового кода. Перемещение части Котлина на их предыдущие этапы затем сделает поток, как вы пожелаете.

Если вы хотите противоположный (первый Java затем Котлин), то вы могли бы переместили часть Котлин на следующих этапах (в качестве примера: от compile до process-classes и от test-compile до process-test-classes).

Для получения дополнительной информации о фазах Maven, проверьте official documentation.

1

В случае, если вы открыты для использования другой системы сборки, зависимые проекты легко настроить с Kobalt:

val p1 = javaProject { ... } 

val p2 = kotlinProject(p1) { ... } 

Это делает проект p2 зависит от p1. Вы также можете смешивать проекты Java и Kotlin.

3

Хотя это более многословным, вы можете скомпилировать как Java и Котлин источники в compile фазе со следующей конфигурацией:

<plugin> 
    <artifactId>kotlin-maven-plugin</artifactId> 
    <groupId>org.jetbrains.kotlin</groupId> 
    <version>${kotlin.version}</version> 
    <executions> 
     <execution> 
      <id>kotlin-compile</id> 
      <phase>compile</phase> 
      <goals> 
       <goal>compile</goal> 
      </goals> 
     </execution> 
     <execution> 
      <id>kotlin-test-compile</id> 
      <phase>test-compile</phase> 
      <goals> 
       <goal>test-compile</goal> 
      </goals> 
     </execution> 
    </executions> 
</plugin> 
<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-compiler-plugin</artifactId> 
    <version>3.5</version> 
    <executions> 
     <execution> 
      <id>default-compile</id> 
      <phase>none</phase> 
     </execution> 
     <execution> 
      <id>default-testCompile</id> 
      <phase>none</phase> 
     </execution> 
     <execution> 
      <id>java-compile</id> 
      <phase>compile</phase> 
      <goals> 
       <goal>compile</goal> 
      </goals> 
     </execution> 
     <execution> 
      <id>java-test-compile</id> 
      <phase>test-compile</phase> 
      <goals> 
       <goal>testCompile</goal> 
      </goals> 
     </execution> 
    </executions> 
</plugin> 

Обычно, плагины выполняются в порядке, они объявлены в ПОМ, но исполнения default-compile и default-testCompile являются особенными, потому что они встроены, поэтому они всегда идут первыми. Вышеупомянутая конфигурация обойдется вокруг этого, отключив выполнение компиляции по умолчанию и объявив maven-compiler-plugin с новыми исполнениями компиляции после kotlin-maven-plugin. Таким образом, вы можете полностью собрать всю компиляцию во время фазы compile жизненного цикла сборки.

+0

Это отлично сработало для меня! – Peter

Смежные вопросы