Maven Compiler Plugin
  1. Maven Compiler Plugin
  2. MCOMPILER-57

State default source (1.3) and target (1.1) in the documentation

    Details

    • Type: Improvement Improvement
    • Status: Closed
    • Priority: Trivial Trivial
    • Resolution: Fixed
    • Affects Version/s: 2.0.2
    • Fix Version/s: 2.1
    • Labels:
      None

      Description

      The documentation does currently say nothing about the compiler defaults, especially source and target version, which is 1.3 and 1.1 (byte code 45.3). It would be helpful to add this information to the docs to make the defaults obvious.

      Respective mailing list content:

      This has been discussed several times on this list.

      IMO, the default compilation target being 1.1 (or another hard-defined
      version) meets the rule of least surprise. You can argue that you
      don't like 1.1 and you'd prefer 1.3 or even 1.5 but that is another
      discussion.

      In contrast, the rule of most surprise would be "my build changes when
      I change my JDK" or "my build changes when I build things on different
      machines". This is the absolute worst thing you can run into when
      trying to standardize and control your build process.

      If you want to target a specific JDK, then simply add the compiler
      configuration in your poms. If you feel this has not been documented
      sufficiently, then post a RFE in Jira and someone will add some text
      to the proper page(s) on the site.

      Wayne

      On 8/15/07, Gisbert Amm <gia@webde.de> wrote:

      >> Searching for version issues, I had a closer look at the *.class files
      >> generated by Maven2 with the default compiler settings and found that
      >> the first bytes of them are "cafe babe 0003 002D ...", which is byte
      >> code version 45.3 = Java 1.1.
      >>
      >> First I was believing that I had this (target 1.1) configured somewhere
      >> by accident. However, I didn't find any such configuration, therefore I
      >> dug into the plexus-compiler source and found the following in
      >> plexus-site/plexus-components/plexus-compiler/plexus-compilers/plexus-compiler-javac/src/main/java/org/codehaus/plexus/compiler/javac/JavacCompiler.java:
      >>
      >> // TODO: this could be much improved
      >> if ( StringUtils.isEmpty( config.getTargetVersion() ) )
      >>

      { >> // Required, or it defaults to the target of your JDK (eg 1.5) >> args.add( "-target" ); >> args.add( "1.1" ); >> }

      >> else
      >>

      { >> args.add( "-target" ); >> args.add( config.getTargetVersion() ); >> }

      >>
      >> if ( !suppressSource( config ) && StringUtils.isEmpty(
      >> config.getSourceVersion() ) )
      >>

      { >> // If omitted, later JDKs complain about a 1.1 target >> args.add( "-source" ); >> args.add( "1.3" ); >> }

      >>
      >> Is there any particular reason why target is set to 1.1 here? IMHO, it
      >> breaks the rule of least surprise for I am certainly expecting that the
      >> generated byte code by default has the version of the JDK I'm using the
      >> compiler of. The comment "Required, or it defaults to the target of your
      >> JDK" doesn't give any reason. Does anybody know, why this default is set?
      >>
      >> At least it should be mentioned on
      >> http://maven.apache.org/plugins/maven-compiler-plugin/howto.html to make
      >> it obvious to users. Otherwise people might have problems and need a
      >> long time to find out what's going on (see
      >> http://www.nabble.com/Odd-Compilation-Issue-tf1566644s177.html#a4287495
      >> for an example).
      >>
      >> Regards,
      >> Gisbert

        Issue Links

          Activity

          Show
          Gisbert Amm added a comment - respective thread on the mailing list: http://www.nabble.com/Why-does-Maven2-by-default-generate-Java-1.1-byte-code--tf4273477s177.html#a12163158
          Show
          Gisbert Amm added a comment - Another baffled user: http://www.nabble.com/annotations-are-not-supported-in--source-1.3-tf4281106s177.html#a12186976
          Hide
          Gisbert Amm added a comment -

          Instead of documenting the defaults it might be even better if the source and target entries in the pom.xml would be mandatory and Maven would refuse to compile at all when they were not set. That would at least make obvious which source and target version the project is supposed to meet.

          Show
          Gisbert Amm added a comment - Instead of documenting the defaults it might be even better if the source and target entries in the pom.xml would be mandatory and Maven would refuse to compile at all when they were not set. That would at least make obvious which source and target version the project is supposed to meet.
          Hide
          Wayne Fay added a comment -

          Maven has a strong preference for "convention over configuration" which means that requiring the source and target entries in the pom is not really reasonable IMO. Instead, the defaults should be documented better, and perhaps the error message could be adjusted to point to a FAQ entry that explains things for new users.

          Show
          Wayne Fay added a comment - Maven has a strong preference for "convention over configuration" which means that requiring the source and target entries in the pom is not really reasonable IMO. Instead, the defaults should be documented better, and perhaps the error message could be adjusted to point to a FAQ entry that explains things for new users.
          Show
          Gisbert Amm added a comment - Another surprised user: http://www.nabble.com/annotations-are-not-supported-in--source-1.3-tf4435690s177.html#a12654771
          Hide
          Wayne Fay added a comment -

          Rather than simply complaining about the issue, please feel free to submit patches etc to help "fix" the "problem". This is an open-source project, and all code and documentation is available to download and patch.

          Show
          Wayne Fay added a comment - Rather than simply complaining about the issue, please feel free to submit patches etc to help "fix" the "problem". This is an open-source project, and all code and documentation is available to download and patch.
          Hide
          Gisbert Amm added a comment -

          Believe it or not - I'm no native English speaker and I don't really dare to write documentation in English. Otherwise I would have already done it. Apart from that: I'm not simply complaining but rather illustrating my original posting where I wrote that the current behaviour of the compiler plugin breaks the rule of least surprise for I was certainly expecting that the generated byte code by default had the version of the JDK I'm using the compiler of. Regarding the last posting I have to add that the source version should be that of the JDK in use aswell. This is no "problem", it's real and confusing users again and again.

          Show
          Gisbert Amm added a comment - Believe it or not - I'm no native English speaker and I don't really dare to write documentation in English. Otherwise I would have already done it. Apart from that: I'm not simply complaining but rather illustrating my original posting where I wrote that the current behaviour of the compiler plugin breaks the rule of least surprise for I was certainly expecting that the generated byte code by default had the version of the JDK I'm using the compiler of. Regarding the last posting I have to add that the source version should be that of the JDK in use aswell. This is no "problem", it's real and confusing users again and again.
          Hide
          Gisbert Amm added a comment -

          What about a more verbose error message telling the user that he/she needs to set the properties "source" and "target" for the maven-compiler-plugin? Wouldn't that be a good idea?

          Show
          Gisbert Amm added a comment - What about a more verbose error message telling the user that he/she needs to set the properties "source" and "target" for the maven-compiler-plugin? Wouldn't that be a good idea?
          Hide
          Stefano Lenzi added a comment -

          They both request better documentation

          Show
          Stefano Lenzi added a comment - They both request better documentation
          Hide
          Gisbert Amm added a comment -

          The patch adds the information about the compiler defaults to the index site of the plugin docs, together with a link to the example that shows how to change the defaults.

          Show
          Gisbert Amm added a comment - The patch adds the information about the compiler defaults to the index site of the plugin docs, together with a link to the example that shows how to change the defaults.
          Hide
          Dennis Lundberg added a comment -

          Patch applied with slight modifications. Thank you!

          Show
          Dennis Lundberg added a comment - Patch applied with slight modifications. Thank you!

            People

            • Assignee:
              Dennis Lundberg
              Reporter:
              Gisbert Amm
            • Votes:
              1 Vote for this issue
              Watchers:
              3 Start watching this issue

              Dates

              • Created:
                Updated:
                Resolved:

                Development