0
votes

Compiler pour l'exécution sous JRE 6 avec Maven

J'ai besoin de compiler une application à utiliser sous JRE 6. Initialement, l'application a été compilée pour une utilisation sous JRE 8.

donc j'ai ajouté: p> xxx pré>

à pom.xml p>

après avoir corrigé toutes les erreurs causées Par l'opérateur de diamant inavouiable, la chaîne dans l'instruction de commutation, etc. J'ai exécuté l'application sous JRE 6 et obtenez l'erreur. P>

Invocation of init method failed; nested exception is java.lang.NoClassDefFoundError: java/nio/file/Paths


0 commentaires

4 Réponses :


2
votes

java.nio.file.Paths a été introduit dans Java 7. Vous devrez modifier la mise en œuvre de votre code en utilisant uniquement des cours disponibles dans Java 6.

et oui, la propriété Maven indique uniquement Javac d'utiliser la syntaxe Java 6. C'est très utile. Maven ne changera pas comme magiquement votre code pour vous. Javac Démarré par Package MVN vous dira des importations non résolues.


4 commentaires

Édité à nouveau. Javac vous dit.


Je suis sûr que c'est la bonne réponse et il devrait être marqué comme un


'MVN Package' n'empêche pas l'application de la construction réussie


Je viens d'insérer Importer Java.Util.Objects; (qui n'existe que depuis Java 7) et exécutez la construction. Aucune erreur.



1
votes

Le but est d'instruire Maven de passer la séréférence et -Target à l'exécutable de la compilation Javac. Il veille à ce que vous n'utilisez que des fonctionnalités linguistiques disponibles dans le JRE donné (l'opérateur Diamond en est un excellent exemple), mais cela n'empêche pas l'utilisation des API qui ne sont arrivés que plus tard.

avoir une lecture de ce

En particulier la partie au bas de la page:

Définir simplement l'option cible ne garantit pas que votre code fonctionne réellement sur une JRE avec la version spécifiée. Le piège est involonté d'utilisation d'API qui n'existent que chez les JRES plus tard ...

Je pense qu'il est injuste de dire que les paramètres ne sont pas utiles, ils sont certainement. Mais ce ne sont pas des outils magiques qui savent quelles bibliothèques peuvent être disponibles au moment de l'exécution.


2 commentaires

D'accord. Pour autant que je sache, il n'ya aucun moyen de construire et d'obtenir tous les avertissements sans installer ce JDK (dans mon cas 6) et mis en place à Maven?


Vous avez tout à fait raison. S'il trouve la bibliothèque incluse sur la classe de classe ou dans le dossier JDK Libs, cela compilera avec bon rapport. Sinon, vous obtiendrez vos erreurs. Sur une note latérale, je crois que les classes Java.nio sont dans Rt.jar. Il y a une chance décente que la copie de Rt.jar de votre dossier JDK7 + Libs sur votre dossier JDK6 Libs fonctionnera. Je ne le recommanderais pas, et ce n'était pas votre question. Il suffit de le mentionner si vous avez envie d'expérimenter et de résoudre votre problème :)



0
votes

Le plug-in Animal Sniffer pour Maven vérifie que les classes compilées avec un nouvel JDK / API sont compatibles avec un ancien JDK / API.

https://www.mojohaus.org/animal-sniffer/


0 commentaires

0
votes

OK. J'ai compris comment le faire.

Vous n'avez pas à installer la cible JDK ou JRE. Tout ce dont vous avez besoin est rt.jar de cette jre. Ensuite, vous devez définir le chemin du fichier JAR dans bootclasspath dans pom.xml. xxx


0 commentaires