Specifying a plugin version number is generally a good idea as the 'latest-and-greatest' may break your build at an unexpected time (usually the day before you need to deliver a product) or worse build differently such that the product breaks. While due diligence is done to ensure that only compatible changes are done to plugins, there are no guarantees that your particular setup is not impacted. Add to that that a particular plugin version may be linked to a particular version of Maven, so latest-and-greatest becomes a set of versions depending on what version of Maven you are using. Perhaps the compiler plugin is a bad example as it's relatively straight forward and probably somewhat immune from breaking changes, but this is a behavior that works for all plugins. I would question your need to use the 'latest-and-greatest' of a plugin. If a plugin works and produces a working artifact, changing it to a newer version should be a conscious decision and not a surprise, anymore than changing versions of Maven should be done automatically. You can mitigate the amount of work needed to change a plugin version by using a parent pom that sets the version, and then all child poms will work with that version. Remember, Infants are the only people that appreciate a change ;) FWIW, Randal Kamradt --------- Original Message --------- Subject: Changing JDK version without specifying maven-compiler-plugin version From: "Malte Skoruppa" <skoru...@cs.uni-saarland.de> Date: 11/26/13 7:59 am To: users@maven.apache.org
Hi, I'm new to Maven and I'm currently going through the "Getting Started" guide. While reading, the following question came to me. As far as I understand, Maven defaults to compiling all Java source files with compatibility for JDK 1.3 (i.e., -source 1.3). The guide explains how to change that behaviour, by configuring the maven-compiler-plugin in the pom.xml: http://maven.apache.org/guides/getting-started/index.html#How_do_I_use_plug-ins So far so good. However, if I do this, it appears that I also have to specify the version of maven-compiler-plugin to be used (e.g., 2.5.1 in the code snippet shown under the above link). Generally, I don't want to do that. On the one hand, I would like for Maven to simply use the latest version of the maven-compiler-plugin that is available (the default behaviour). On the other hand, I would like to use Java features above 1.3 (for instance, generics). So my first attempt was to simply remove the "<version>2.5.1</version>" part from the pom.xml under the maven-compiler-plugin configuration. While this did in principle work, Maven was not happy at all and complained with this message: [WARNING] Some problems were encountered while building the effective model for com.mycompany.app:my-app:jar:1.0-SNAPSHOT [WARNING] 'build.plugins.plugin.version' for org.apache.maven.plugins:maven-compiler-plugin is missing. @ line 19, column 15 [WARNING] [WARNING] It is highly recommended to fix these problems because they threaten the stability of your build. [WARNING] [WARNING] For this reason, future Maven versions might no longer support building such malformed projects. So my question boils down to this: is there some way for me to achieve the following three things at the same time: (1) have Maven compile my source files with -source 1.4 (or anything higher than 1.3) (2) *not* specify the maven-compiler-plugin version to use; instead, have Maven dynamically use the latest one available; (3) *not* have Maven bitch about my project being "malformed" ;-) I would imagine that this is not such a rare scenario: (1) I do want to use Java features higher than those available in Java 1.3; (2) I do *not* want having to monitor the maven-compiler-plugin by myself all the time in order to check for updates and keep my pom.xml referring to the currently latest version; (3) yet I do *not* want Maven complaining about my project.xml being malformed either. So what's the "clean" way to do this? :-) For clarity, I have written down the steps to reproduce my problem in the Appendix, below. Thanks, Malte APPENDIX: Steps to reproduce: 1. Generate a simple Maven project using the very command stated on http://maven.apache.org/guides/getting-started/index.html#How_do_I_make_my_first_Maven_project : mvn archetype:generate \ -DarchetypeGroupId=org.apache.maven.archetypes \ -DgroupId=com.mycompany.app \ -DartifactId=my-app 2. Replace the generated src/main/java/com/mycompany/app/App.java with something that uses generics (not available in Java 1.3), e.g.: package com.mycompany.app; import java.util.*; /** * Hello world! * */ public class App { public static void main( String[] args) { List<String> myList = new ArrayList<String>(); myList.add( "Hello"); myList.add( "world"); for( Iterator<String> i = myList.iterator(); i.hasNext();) System.out.println( i.next()); } } 3. Try to compile using the command 'mvn compile'. Maven fails: $ mvn compile [INFO] Scanning for projects... ... [INFO] ------------------------------------------------------------------------ [INFO] BUILD FAILURE [INFO] ------------------------------------------------------------------------ [INFO] Total time: 0.995s [INFO] Finished at: Tue Nov 26 15:26:00 CET 2013 [INFO] Final Memory: 6M/117M [INFO] ------------------------------------------------------------------------ [ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.0.2:compile (default-compile) on project my-app: Compilation failure [ERROR] /home/malte/dev/java/testMaven/my-app/src/main/java/com/mycompany/app/App.java:[13,5] error: generics are not supported in -source 1.3 ... 4. Ok, so let's add the following to our pom.xml. This is copied&pasted from http://maven.apache.org/guides/getting-started/index.html#How_do_I_use_plug-ins : <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.5.1</version> <configuration> <source>1.5</source> <target>1.5</target> </configuration> </plugin> </plugins> </build> Running 'mvn compile' again, everything works fine now. 5. Yet, I would like to avoid having to specify the version of maven-compiler-plugin to be used. I simply want Maven to use the latest one available. So, let's remove the line <version>2.5.1</version> from the pom.xml again. Running 'mvn compile' again, this works too, but Maven complains: $ mvn compile [INFO] Scanning for projects... [WARNING] [WARNING] Some problems were encountered while building the effective model for com.mycompany.app:my-app:jar:1.0-SNAPSHOT [WARNING] 'build.plugins.plugin.version' for org.apache.maven.plugins:maven-compiler-plugin is missing. @ line 19, column 15 [WARNING] [WARNING] It is highly recommended to fix these problems because they threaten the stability of your build. [WARNING] [WARNING] For this reason, future Maven versions might no longer support building such malformed projects. [WARNING] ... [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 0.877s [INFO] Finished at: Tue Nov 26 15:37:17 CET 2013 [INFO] Final Memory: 5M/117M [INFO] ------------------------------------------------------------------------ --------------------------------------------------------------------- To unsubscribe, e-mail: users-unsubscr...@maven.apache.org For additional commands, e-mail: users-h...@maven.apache.org