2017-08-30 1 views
3

J'essaye de construire spring-boot application qui utilise java-9 et serait déployé à heroku. En tant qu'outil de construction, j'utilise maven. J'ai généré l'application spring boot 1.5 en utilisant initializr. J'ai ajouté heroku des fichiers spécifiques et ajouté toolchains.xml au référentiel .m2 pour maven-compiler-plugin.échec de compilation pour l'application de démarrage de printemps avec java 9 et maven

Mon pom.xml ressemble à ceci

<?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> 

    <groupId>com.lapots.breed.platform.cloud</groupId> 
    <artifactId>java-cloud-sample</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    <packaging>jar</packaging> 

    <name>java-cloud-sample</name> 
    <description>Demo project for Spring Boot</description> 

    <parent> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-parent</artifactId> 
     <version>1.5.6.RELEASE</version> 
     <relativePath/> <!-- lookup parent from repository --> 
    </parent> 

    <properties> 
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
     <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> 
     <java.version>1.9</java.version> 
     <maven.compiler.source>1.9</maven.compiler.source> 
     <maven.compiler.target>1.9</maven.compiler.target> 
     <maven.compiler.release>9</maven.compiler.release> 
    </properties> 

    <dependencies> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-actuator</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-web</artifactId> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-devtools</artifactId> 
      <scope>runtime</scope> 
     </dependency> 
     <dependency> 
      <groupId>org.postgresql</groupId> 
      <artifactId>postgresql</artifactId> 
      <scope>runtime</scope> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-test</artifactId> 
      <scope>test</scope> 
     </dependency> 
    </dependencies> 

    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.springframework.boot</groupId> 
       <artifactId>spring-boot-maven-plugin</artifactId> 
       <executions> 
        <execution> 
         <goals> 
          <goal>build-info</goal> 
         </goals> 
         <configuration> 
          <additionalProperties> 
           <encoding.source>${project.build.sourceEncoding}</encoding.source> 
           <encoding.reporting>${project.reporting.outputEncoding}</encoding.reporting> 
           <java.source>${maven.compiler.source}</java.source> 
           <java.target>${maven.compiler.target}</java.target> 
          </additionalProperties> 
         </configuration> 
        </execution> 
       </executions> 
      </plugin> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
        <artifactId>maven-compiler-plugin</artifactId> 
        <version>3.6.0</version> 
      </plugin> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-toolchains-plugin</artifactId> 
       <version>1.1</version> 
       <configuration> 
        <toolchains> 
         <jdk> 
          <version>1.9</version> 
          <vendor>oracle</vendor> 
         </jdk> 
        </toolchains> 
       </configuration> 
       <executions> 
        <execution> 
         <goals> 
          <goal>toolchain</goal> 
         </goals> 
        </execution> 
       </executions> 
      </plugin> 
     </plugins> 
    </build> 


</project> 

Lorsque je tente de compilateur projet à l'aide mvn clean package je reçois l'erreur

[ERROR] COMPILATION ERROR : 
[INFO] ------------------------------------------------------------- 
[ERROR] javac: invalid flag: -Xmodule:null 
Usage: javac <options> <source files> 
use --help for a list of possible options 

[INFO] 1 error 
[INFO] ------------------------------------------------------------- 
[INFO] ------------------------------------------------------------------------ 
[INFO] BUILD FAILURE 
[INFO] ------------------------------------------------------------------------ 
[INFO] Total time: 3.031 s 
[INFO] Finished at: 2017-08-30T21:08:25+03:00 
[INFO] Final Memory: 20M/309M 
[INFO] ------------------------------------------------------------------------ 
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.6.0:testCompile (default-testCompile) on 
project java-cloud-sample: Compilation failure 
[ERROR] javac: invalid flag: -Xmodule:null 
[ERROR] Usage: javac <options> <source files> 
[ERROR] use --help for a list of possible options 
[ERROR] 
[ERROR] 
[ERROR] -> [Help 1] 
[ERROR] 
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch. 
[ERROR] Re-run Maven using the -X switch to enable full debug logging. 
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles: 
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException 

module-info ressemble à ceci

module com.lapots.breed.platform.cloud.javacloudsample { 
    requires spring.boot; 
} 

Quel est le problème ? Projet ici github repository

Répondre

8

maven-plugin-compilateur 3.6.0 est basé sur la première signature de module-info.class, qui a changé plusieurs fois. Ce n'est pas compatible avec la signature Java 9 actuelle. Vous devriez utiliser 3.6.2 lors de l'utilisation des versions les plus récentes de JDK 9.

+0

wow, il peut y avoir un tel problème ... Je suppose que je devrais lire à propos de Java 9 plus – lapots

+3

c'est le problème lorsque vous travaillez avec ea-versions. Ce n'est pas officiel, mais les utilisateurs veulent l'expérimenter. Donc, tous les maven-compiler-plugin 3.6.x ne fonctionneront pas avec Java 9. Je ferai bientôt un 3.7.0 pour marquer la première version officielle de support de Java 9. Pas beaucoup de différence par rapport à l'actuel sur :) –

+0

Mais il semble que le problème lui-même avec 'testCompile' pas la tâche de compilation' raw' – lapots

1

On dirait que votre toolchains.xml ne comprend pas d'entrée pour Java 9. Essayez ceci:

<toolchain> 
    <type>jdk</type> 
    <provides> 
     <version>1.9</version> 
     <vendor>oracle</vendor> 
    </provides> 
    <configuration> 
     <jdkHome>/path/to/jdk/9</jdkHome> 
    </configuration> 
</toolchain> 
+0

mais comprend. J'utilise le même 'toolchains.xml' que dans le dépôt' github' comme dans le dossier '.m2'. Il semble échouer sur compilation 'test' – lapots

+1

Cela ne devrait pas être la cause, il doit être compile-plugin utilisé pour le cas ci-dessus. – nullpointer

2

Remarqué par @Robert vous devez mettre à jour votre maven-compiler-plugin. Pour ajouter à cela, aussi comme indiqué dans le Maven/Jigsaw+9 sur les plugins Maven. La version minimale compatible maven-compiler-plugin avec le courant jdk-9+181 est 3.6.2 qui peut être utilisé comme:

<!--Minimum compatible version required--> 
<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-compiler-plugin</artifactId> 
    <version>3.6.2</version> 
    <configuration> 
     <jdkToolchain> 
      <version>9</version> 
     </jdkToolchain> 
    </configuration> 
</plugin> 

Et de citer l'un des examples of maven-compiler-plugin with module-info.java ici:

Pour les projets qui veulent être compatible avec les anciennes versions de Java (ie 1.8 ou ci-dessous), mais aussi vouloir fournir un module-info.java pour Jav un 9 projets doivent être conscients qu'ils besoin d'appeler javac deux fois: le module-info.java doit être compilé avec release = 9, tandis que le reste de les sources doivent être compilés avec une version inférieure de la source/cible .

qui peut être réalisée à l'aide (JAVA_HOME défini comme 1.8.x):

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-compiler-plugin</artifactId> 
    <version>3.6.2</version> 
    <executions> 
     <execution> 
     <id>default-compile</id> 
     <configuration> 
      <!-- compile everything to ensure module-info contains right entries --> 
      <!-- required when JAVA_HOME is JDK 8 or below --> 
      <jdkToolchain> 
      <version>9</version> 
      </jdkToolchain> 
      <release>9</release> 
     </configuration> 
     </execution> 
     <execution> 
     <id>base-compile</id> 
     <goals> 
      <goal>compile</goal> 
     </goals> 
     <!-- recompile everything for target VM except the module-info.java --> 
     <configuration> 
      <excludes> 
      <exclude>module-info.java</exclude> 
      </excludes> 
     </configuration> 
     </execution> 
    </executions> 
    <!-- defaults for compile and testCompile --> 
    <configuration> 
     <!-- jdkToolchain required when JAVA_HOME is JDK 9 or above --> 
     <jdkToolchain> 
     <version>[1.5,9)</version> 
     </jdkToolchain> 
     <source>1.5</source> 
     <target>1.5</target> 
    </configuration> 
</plugin> 

Peu de choses à noter: il se sont

... vous aurez besoin d'au moins Maven 3.3.1 pour spécifier une coutume jdkToolchain dans votre configuration du plugin


Vous pouvez également configurer le JAVA_HOME/jdk9/Contenu/Accueil/bin et utiliser la configuration suivante:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-compiler-plugin</artifactId> 
    <version>3.6.2</version> 
    <executions> 
     <execution> 
     <id>default-compile</id> 
     <configuration> 
      <!-- compile everything to ensure module-info contains right entries --> 
      <release>9</release> 
     </configuration> 
     </execution> 
     <execution> 
     <id>base-compile</id> 
     <goals> 
      <goal>compile</goal> 
     </goals> 
     <!-- recompile everything for target VM except the module-info.java --> 
     <configuration> 
      <excludes> 
      <exclude>module-info.java</exclude> 
      </excludes> 
     </configuration> 
     </execution> 
    </executions> 
    <!-- defaults for compile and testCompile --> 
    <configuration> 
     <!-- Only required when JAVA_HOME isn't at least Java 9 and when haven't configured the maven-toolchains-plugin --> 
     <jdkToolchain> 
     <version>9</version> 
     </jdkToolchain> 
     <release>6</release> 
    </configuration> 
</plugin>