Maven: javac: la version source 1.6 nécessite la version cible 1.6

NOTE: ceci semble être une limite dans le programme "javac".

j'ai du code Java 6 qui doit être construit pour une Java 5 JVM. Mon travail précédent avec la cible javac ant (à la fois avec le compilateur JDK et avec CJE) m'a amené à croire qu'il s'agirait simplement de définir la source et la cible de javac. D'où cette pom.fragment xml suivant:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>2.3.2</version>
    <configuration>
        <source>1.6</source>
        <target>1.5</target>
    </configuration>
</plugin>

qui fonctionne comme prévu dans Eclipse 3.7 avec le support Maven. Malheureusement, exécuter Maven directement à partir de la ligne de commande me donner

javac: source release 1.6 requires target release 1.6

qui est la même que celle générée par javac -source 1.6 -target 1.5. Pour clarifier, Ceci est L'OpenJDK 6 officiel pour Ubuntu

[email protected]:~$ javac -version
javac 1.6.0_20
[email protected]:~$ javac -source 1.6 -target 1.5
javac: source release 1.6 requires target release 1.6
[email protected]:~$

le JDK officiel D'Oracle Java 7 Pour Windows montre le même comportement.

Note: Je ne veux pas construire avec les bibliothèques Java 5 ou autre. Juste que javac active génère Java 5 compatible bytecode.

Comment puis-je obtenir ce que je veux tout en étant compatible avec L'éclipse Maven plugin?

(EDIT: En plus de l' @Override je tiens également à compiler contre JAX-WS bibliothèques Java 6 lorsqu'il est utilisé, mais encore Java généré 5 octets de code, je peux ensuite ajouter le JAX-WS bibliothèques délibérément dans le conteneur web lors du déploiement d'un Java 5 installation)


EDIT: il s'avère que maven-compiler-plugin peut se faire dire d'utiliser un autre compilateur, et le compilateur Eclipse peut le faire:

        <plugin>
            <!-- Using the eclipse compiler allows for different source and target, 
                which is a good thing (outweighing that this is a rarely used combination, 
                and most people use javac) This should also allow us to run maven builds 
                on a JRE and not a JDK. -->

            <!-- Note that initial experiments with an earlier version of maven-compiler-plugin 
                showed that the eclipse compiler bundled with that gave incorrect lines in 
                the debug information. By using a newer version of the plexus-compiler-eclipse 
                plugin this is hopefully less of an issue. If not we must also bundle a newer 
                version of the eclipse compiler itself. -->

            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.0</version>
            <configuration>
                <source>1.6</source>
                <target>1.5</target>
                <debug>true</debug>
                <optimize>false</optimize>
                <fork>true</fork>
                <compilerId>eclipse</compilerId>
            </configuration>
            <dependencies>
                <dependency>
                    <groupId>org.codehaus.plexus</groupId>
                    <artifactId>plexus-compiler-eclipse</artifactId>
                    <version>2.1</version>
                </dependency>
            </dependencies>
        </plugin>

qui compile les classe à Java 1.5 bytecode sans plaintes. Ceci est également pris en charge "out of the box" pour m2e pour Eclipse Java EE 4.2.2.

EDIT: j'ai trouvé que de toutes les choses de la javadoc l'outil n'aime pas la sortie du compilateur Eclipse.

EDIT 2015-06-28: j'ai fait un test rapide récemment et la dernière CJE (correspondant à Eclipse 4.4) a bien fonctionné avec javadoc.

24
demandé sur Thorbjørn Ravn Andersen 2012-01-23 15:30:25
la source

6 ответов

la limitation est en javac. La solution est de dire à maven d'utiliser un autre compilateur. Voir la question pour plus de détails.

12
répondu Thorbjørn Ravn Andersen 2012-03-12 13:39:29
la source

il semble que si vous voulez faire une compilation croisée vous devez fournir quelques arguments supplémentaires -bootclasspath et

je crois que vous avez besoin de définir -bootclasspath en tant que bien de sorte que javac compile contre JDK 1.5 bootstrap classes.

Essaie:

javac -source 1.6 -target 1.5 -bootclasspath /path/to/jdk1.5/lib/rt.jar -extdirs "" Foo.java

mise à jour:

essayez d'enlever le -source option, mais garder l' -target option.

je viens de tester ça:

# no source, only target => COMPILES to 1.5
$ javac -target 1.5 Foo.java
$ javap -v  Foo | grep version
  minor version: 0
  major version: 49

# no source, no target => COMPILES to 1.6
$ javac Foo.java
$ javap -v  Foo | grep version
  minor version: 0
  major version: 50

# both source and target => ERROR
$ javac -source 1.6 -target 1.5 Foo.java
javac: source release 1.6 requires target release 1.6

$ javac -version
javac 1.6.0_21
2
répondu dogbane 2012-01-23 15:48:41
la source

quelles fonctionnalités du langage Java 6 utilisez-vous qui ne sont pas présentes dans Java 5? Pour autant que je sache, la seule "caractéristique" qui a été ajoutée à la langue est l'utilisation de @Override annotation dans interface s. Autrement, Java 6 et Java 5 sont compatibles avec les sources. Ce qui se passe quand vous utilisez:

<source>1.5</source>
<target>1.5</target>

dans votre fichier de construction Maven?

1
répondu Jonathan 2012-01-23 15:51:40
la source

j'ai eu la même erreur quand j'ai mis à jour mon IntelliJ IDE, il a été corrigé avec le remplacement de 1.5 par 1.6 comme ci-dessous.

       <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>1.6</source>
                <target>1.6</target>
            </configuration>
        </plugin>
1
répondu Krishna Sapkota 2013-12-20 18:02:43
la source

La vraie question est donc d'utiliser @Override dans les fichiers source qui doivent être compilés dans les fichiers de classe Java 1.5.

javac -source 1.5 -target 1.5 aFileWithOverride.java

va faire exactement cela. Dans le jdk 7, cela va entraîner un avertissement

[options] bootstrap class path not set in conjunction with -source 1.5

qui est absent dans jdk 6.

pour se débarrasser de cet avertissement, une classe de boot spéciale jar peut être créée en ajoutant le java 6 (ou supérieur) java.lang.annotation package java 5 rt.jar.

-1
répondu Ekj 2014-04-26 01:17:50
la source

Autres questions sur