2015-03-13 1 views
0

J'ai un projet avec un pom.xml qui a la déclaration <build> suivante:Installation et compilation des artefacts Maven sur Java 8

<build> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <version>3.1</version> 
      <configuration> 
       <source>1.8</source> 
       <target>1.8</target> 
       <encoding>UTF-8</encoding> 
      </configuration> 
     </plugin> 
    </plugins> 
</build> 

Quand je lance mvn install sur ce projet, il compile le projet, exécute des tests unitaires et publie à mon repo local. Je suis en train d'apprendre un peu plus sur Maven ici, et je suis un moment difficile de trouver la documentation/explications sur les points suivants:

  • Comment suis-je capable de courir mvn install, si le POM ne déclare pas sous build/plugins ? Est-ce que maven-compiler-plugin comprend maven-install-plugin, si oui, comment aurais-je pu comprendre cela?
  • Plus important encore: la valeur build/plugins/plugin/configuration/source et .../target sont toutes les deux réglées sur 1.8. Si ma machine a Java 8 dessus, et que je cours mvn install sur ce projet sans aucune erreur, est-ce que garantit que le projet construit avec Java 8? Je regarde le docs for the Compiler Plugin et ne vois pas ces source/target configs répertorié n'importe où.
+1

Pour les docs, regardez ici: http://maven.apache.org/plugins/maven-compiler-plugin/compile-mojo.html – khmarbaise

+0

Merci @khmarbaise (+1) - à partir de ce lien j'ai trouvé le [Lifecycle Doc ] (http://maven.apache.org/ref/3.2.5/maven-core/lifecycles.html), et voir que 'compile' est en amont de' install', ce qui explique pourquoi faire un 'install' déclenche un 'compile'.Cependant, cela n'explique pas pourquoi le POM déclare le plugin du compilateur, mais pas le plugin d'installation. Pensées? – smeeb

+0

@smeeb parce que ce n'est pas obligatoire. maven est livré avec une compilation et un plugin d'installation - ils sont intégrés. Presque chaque version maven est fournie avec une version différente de ces plugins. Vous pouvez _mayer_ la version ou la configurer, mais vous n'êtes pas obligé de le faire. Par exemple. si vous voulez dire au plugin de compilation _how_ (quel niveau de langue) de compiler. – Alexander

Répondre

4

D'abord vous devriez apprendre ce qu'est le cycle de vie de la construction et comment cela fonctionne et comment les plugins are bound to the life cycle by default.

En outre, vous devez comprendre que dans Maven chaque projet hérite du fichier super pom qui fait partie de la distribution maven (le paquet que vous avez téléchargé). Le super pom définit la disposition des dossiers par défaut et certaines versions des plugins.

La question de définir le maven-compiler-plugin comme vous l'avez fait est d'être très précis tout simplement faux. Vous devez avoir défini comme les suivantes:

<build> 
    <pluginManagement> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <configuration> 
       <source>1.8</source> 
       <target>1.8</target> 
       <encoding>UTF-8</encoding> 
      </configuration> 
     </plugin> 
    </plugins> 
    </pluginManagement> 
</build> 

Cette écraserait la définition qui est héritée par le super pom et modifie sa configuration. Dans votre cas, je vous suggère de modifier la définition dans ce:

<project> 
    ... 
    <properties> 
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    </properties> 

    <build> 
     <pluginManagement> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <version>3.2</version> 
       <configuration> 
        <source>1.8</source> 
        <target>1.8</target> 
       </configuration> 
      </plugin> 
     </plugins> 
     </pluginManagement> 
    </build> 
    .. 
    </project> 

Le codage doit être défini globalement la cause il y a d'autres plugins qui utilisent cette définition comme le maven-resources-plugin. L'utilisation de la propriété ci-dessus simplifie cela, car chaque plugin qui a une option d'encodage utilisera le default as defined in the property.

Pour être sûr d'utiliser la bonne version de Java (votre JDK sur votre machine), vous devez utiliser le maven-enforcer-plugin.

En dehors de cela s'il vous plaît jeter un oeil sur le plugins page which shows the most up-to-date releases of the plugins.

Comme une bonne documentation, je peux recomment le Books on Maven mais sachez qu'ils sont écrits avec Maven 2 à l'esprit. Donc, si quelque chose n'est pas clair, demandez aux utilisateurs la liste de diffusion ici sur SO.

+0

Merci @khmarbaise (+1) - c'est une très bonne réponse, et je vais absolument creuser dans tous ces liens que vous avez postés. Je vous remercie! À court terme, cependant, je ne comprends toujours pas complètement les déclarations '1.8' pour le plugin du compilateur. Tout ce que je veux m'assurer, c'est que ma bibliothèque compile et compile (construit) sur Java 8. Avec vos changements suggérés, l'exécution de 'mvn install' réussira-t-elle à le prouver? Merci encore! – smeeb

+0

Vous devez être conscient que, par exemple, un compilateur javac JDK 9 a aussi les options 'source' et' target' et peut être utilisé pour produire des fichiers de classe compatibles avec Java 1.7. Mais cela peut être différent de la compilation de ces classes avec un compilateur Java 1.7. Ce qui précède fait la même chose. Si vous avez vraiment besoin d'être sûr (100%) d'utiliser JDK 8, vous devez passer par maven-enforcer-plugin et vérifier que le JDK installé est la version que vous attendez. – khmarbaise