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" <[email protected]>
Date: 11/26/13 7:59 am
To: [email protected]
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: [email protected]
For additional commands, e-mail: [email protected]