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

Setting the debug option to false still compiles the code with line numbers resulting in increased class file.

    Details

    • Type: Bug Bug
    • Status: Closed Closed
    • Priority: Major Major
    • Resolution: Won't Fix
    • Affects Version/s: 2.1
    • Fix Version/s: None
    • Labels:
      None
    • Environment:
      Windows XP Professional Version 5.1.2600 Service Pack 3 Build 2600, Dell OptiPlex GX280, Total Physical Memory 4,096.00 MB


    • Testcase included:
      yes
    • Number of attachments :
      1

      Description

      Given the following example:

      Bar.java
      public class Main {
         public static void main(String[] args) {
            for (StackTraceElement stackTraceElement : Thread.currentThread().getStackTrace())
               System.out.println(stackTraceElement);
         }
      }
      

      and pom.xml

      <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
      
         <modelVersion>4.0.0</modelVersion>
         <groupId>com.greg</groupId>
         <artifactId>TestApp</artifactId>
         <version>1</version>
         <build>
            <plugins>
               <plugin>
                  <groupId>org.apache.maven.plugins</groupId>
                  <artifactId>maven-compiler-plugin</artifactId>
                  <configuration>
                     <debug>none</debug>
                     <source>1.5</source>
                     <target>1.5</target>
                  </configuration>
               </plugin>
            </plugins>
         </build>
      </project>
      

      after compiling and running we get:

      cmd
      {TestApp}\target\classes>dir Main.class
      05/02/2010  XX:XX               564 Main.class
      
      {TestApp}\target\classes>java -cp . Main
      java.lang.Thread.dumpThreads(Native Method)
      java.lang.Thread.getStackTrace(Thread.java:1383)
      Main.main(Main.java:3)
      

      NOTE !!!: the number of line (Main.java:3) has been shown

      However when you compile the same java code using the javac we get:

      cmd
      {TestApp}\src\main\java>javac -g:none -source 1.5 -target 1.5 Main.java
      
      {TestApp}\src\main\java>dir Main.class
      05/02/2010  XX:XX               477 Main.class
      
      {TestApp}\src\main\java>java -cp . Main
      java.lang.Thread.dumpThreads(Native Method)
      java.lang.Thread.getStackTrace(Thread.java:1383)
      Main.main(Unknown Source)

      NOTE !!!: the number of line has not been shown

      Please find the whole sample project in Eclipse that uses m2eclipse plugin, that is configured for using external maven 2.2.1

        Activity

        Hide
        Stephen Bannasch added a comment -

        When I compile with -Dmaven.compiler.debug=true I do get a reduction in size however compiled code is still 10-20% larger than that compiled by either ant with debug=false or javac with the '-g:none' option.

        Here's a closer look at the same class extracted from jars created with maven and ant using debug-false:

        $ javap -l -verbose -c org/concord/mw2d/ActionStateEvent
        

        The maven-generated class had three constants not in the ant-generated class:

        const #12 = Asciz	LineNumberTable;
        const #16 = Asciz	SourceFile;
        const #17 = Asciz	ActionStateEvent.java;
        

        In addition each method in the class had a LineNumberTable like this:

        LineNumberTable:
         line 30: 0
         line 31: 5
         line 32: 10
         line 33: 15
        

        It seems the only way to get maven to compile without the debugging resources is to add 'g:none' as a compiler argument for javac ... and this doesn't work from the command line – it only works if it is in the configuration element for the maven-compiler-plugin in the pom like this:

        <build>
          <plugins>
            <plugin>
              <groupId>org.apache.maven.plugins</groupId>
              <artifactId>maven-compiler-plugin</artifactId>
              <configuration>
                <compilerArgument>-g:none</compilerArgument>
                <source>1.5</source>
                <target>1.5</target>
              </configuration>
            </plugin>
          </plugins>
        </build>
        

        If the compilerArgument to 'g:none' is not set in the pom I can't get any variation of the following command line arguments to compile without some debugging info.

        with or without:

        maven.compiler.debug=false
        

        with or without any of the following:

        maven.compiler.compilerArgument=g:none
        maven.compiler.compilerArgument='g:none'
        maven.compiler.compilerArguments=g:none
        maven.compiler.compilerArgument='g:none'
        

        But I'd like the default to include debugging resources and to be able to easily optionally package without the debug resources – the easiest way would be able to pass in a command line argument ...

        Show
        Stephen Bannasch added a comment - When I compile with -Dmaven.compiler.debug=true I do get a reduction in size however compiled code is still 10-20% larger than that compiled by either ant with debug=false or javac with the '-g:none' option. Here's a closer look at the same class extracted from jars created with maven and ant using debug-false: $ javap -l -verbose -c org/concord/mw2d/ActionStateEvent The maven-generated class had three constants not in the ant-generated class: const #12 = Asciz LineNumberTable; const #16 = Asciz SourceFile; const #17 = Asciz ActionStateEvent.java; In addition each method in the class had a LineNumberTable like this: LineNumberTable: line 30: 0 line 31: 5 line 32: 10 line 33: 15 It seems the only way to get maven to compile without the debugging resources is to add 'g:none' as a compiler argument for javac ... and this doesn't work from the command line – it only works if it is in the configuration element for the maven-compiler-plugin in the pom like this: <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <compilerArgument>-g:none</compilerArgument> <source>1.5</source> <target>1.5</target> </configuration> </plugin> </plugins> </build> If the compilerArgument to 'g:none' is not set in the pom I can't get any variation of the following command line arguments to compile without some debugging info. with or without: maven.compiler.debug=false with or without any of the following: maven.compiler.compilerArgument=g:none maven.compiler.compilerArgument='g:none' maven.compiler.compilerArguments=g:none maven.compiler.compilerArgument='g:none' But I'd like the default to include debugging resources and to be able to easily optionally package without the debug resources – the easiest way would be able to pass in a command line argument ...
        Hide
        Stephen Bannasch added a comment -

        The forensics on the maven-generated version of the class files above was generated with v2.0.2 of the compiler plugin.

        In that example (where there was a partial reduction in compiled class size) I was passing in the debug=false parameter on the command line:

        $ mvn clean; mvn -Dmaven.compiler.debug=true
        

        I just tried with v2.3.2 of the compiler plugin and running the same command from a shell now produces compiled code with all the additional debug resources.

        Setting <compilerArgument>-g:none</compilerArgument> still results in compilation without adding debug resources when using v2.3.2 of the compiler plugin

        Show
        Stephen Bannasch added a comment - The forensics on the maven-generated version of the class files above was generated with v2.0.2 of the compiler plugin. In that example (where there was a partial reduction in compiled class size) I was passing in the debug=false parameter on the command line: $ mvn clean; mvn -Dmaven.compiler.debug=true I just tried with v2.3.2 of the compiler plugin and running the same command from a shell now produces compiled code with all the additional debug resources. Setting <compilerArgument>-g:none</compilerArgument> still results in compilation without adding debug resources when using v2.3.2 of the compiler plugin
        Hide
        Stephen Bannasch added a comment -

        Ahh ... also setting the debuglevel=none parameter is the solution:

        The examples below refer to a jar I am building: mw.jar with a nominal size of 7.2 MB

        mvn -Dmaven.compiler.debug=true -Dmaven.compiler.debuglevel=none
        

        results in an mw.jar that is just 5.4 MB.

        So ... the logic is:

        During a regular mvn compile maven.compiler.debug is true and the debug resources are added... so far so good, that makes stacktraces useful.

        mw.jar => 7.2 MB
        

        Setting maven.compiler.debug to false makes the compiled code smaller ... but some debug stuff is still there:

        mw.jar => 6.3 MB
        

        Setting maven.compiler.debuglevel to 'none' results in the smallest code size:

        mw.jar => 5.4 MB
        

        But only if maven.compiler.debug is also set to true! If maven.compiler.debug is false and maven.compiler.debuglevel is none:

        mw.jar => 6.3 MB
        

        http://maven.apache.org/plugins/maven-compiler-plugin/compile-mojo.html#debuglevel

        Keyword list to be appended to the -g command-line switch.
        Legal values are none or a comma-separated list of the
        following keywords: lines, vars, and source. If debuglevel is
        not specified, by default, nothing will be appended to -g. If
        debug is not turned on, this attribute will be ignored.

        Maven is special ...

        Show
        Stephen Bannasch added a comment - Ahh ... also setting the debuglevel=none parameter is the solution: The examples below refer to a jar I am building: mw.jar with a nominal size of 7.2 MB mvn -Dmaven.compiler.debug=true -Dmaven.compiler.debuglevel=none results in an mw.jar that is just 5.4 MB. So ... the logic is: During a regular mvn compile maven.compiler.debug is true and the debug resources are added... so far so good, that makes stacktraces useful. mw.jar => 7.2 MB Setting maven.compiler.debug to false makes the compiled code smaller ... but some debug stuff is still there: mw.jar => 6.3 MB Setting maven.compiler.debuglevel to 'none' results in the smallest code size: mw.jar => 5.4 MB But only if maven.compiler.debug is also set to true! If maven.compiler.debug is false and maven.compiler.debuglevel is none: mw.jar => 6.3 MB http://maven.apache.org/plugins/maven-compiler-plugin/compile-mojo.html#debuglevel Keyword list to be appended to the -g command-line switch. Legal values are none or a comma-separated list of the following keywords: lines, vars, and source. If debuglevel is not specified, by default, nothing will be appended to -g. If debug is not turned on, this attribute will be ignored. Maven is special ...
        Hide
        David H Vree added a comment -

        I just tried the debug=true, debuglevel=none approach. As near as I can tell the line number table is STILL in the class file.

        Show
        David H Vree added a comment - I just tried the debug=true, debuglevel=none approach. As near as I can tell the line number table is STILL in the class file.
        Hide
        Stephen Bannasch added a comment -

        David, Which versions of the compiler plugin are you using?

        I was using v2.3.2 in my tests above.

        ...
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>2.3.2</version>
        
        Show
        Stephen Bannasch added a comment - David, Which versions of the compiler plugin are you using? I was using v2.3.2 in my tests above. ... <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.3.2</version>
        Hide
        David H Vree added a comment -

        @Stephen - I was using 2.0.2. Apparently that is what Maven 2.2.1 uses by default.

        When I switch to 2.3.2 I could replicate your behavior exactly. Apparently v2.0.2 quietly ignores the <debuglevel> configuration option.

        Show
        David H Vree added a comment - @Stephen - I was using 2.0.2. Apparently that is what Maven 2.2.1 uses by default. When I switch to 2.3.2 I could replicate your behavior exactly. Apparently v2.0.2 quietly ignores the <debuglevel> configuration option.
        Hide
        Michael Osipov added a comment -

        Please refer to https://cwiki.apache.org/confluence/display/MAVEN/The+Great+JIRA+Cleanup+of+2014 if you're wondering why this issue was closed out.

        Show
        Michael Osipov added a comment - Please refer to https://cwiki.apache.org/confluence/display/MAVEN/The+Great+JIRA+Cleanup+of+2014 if you're wondering why this issue was closed out.

          People

          • Assignee:
            Unassigned
            Reporter:
            Grzegorz Solecki
          • Votes:
            2 Vote for this issue
            Watchers:
            3 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved: