[ 
http://jira.codehaus.org/browse/MCOMPILER-97?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=260564#action_260564
 ] 

Ramon Buckland commented on MCOMPILER-97:
-----------------------------------------

I needed to do something similar. 

I have a Unit Test which actually runs my Processor by calling the JavaCompiler.

{{{

    @Test
    public void fullComprehensiveTest() {


       ...
        
        // Get an instance of java compiler
        JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();

        // Get a new instance of the standard file manager implementation
        StandardJavaFileManager fileManager = 
compiler.getStandardFileManager(null, null, null);
        List<String> options = new ArrayList<String>();
        options.add("-d");
        File outputDir = new File("target", "processor-test");
        outputDir.mkdirs();
        options.add(outputDir.getAbsolutePath());

        options.add("-s");
        options.add(outputDir.getAbsolutePath());

        // Get the list of java file objects
        SrcFilesTestClass srcFiles = new SrcFilesTestClass();

        System.out.println(">> testing: files to run annotation test on (only 
some have annotations): ");
        for (String f : srcFiles.srcFiles()) {
            System.out.println(f);
        }

        Iterable<? extends JavaFileObject> compilationUnits1 = 
fileManager.getJavaFileObjects(srcFiles.srcFiles());

        StringWriter output = new StringWriter();
        CompilationTask task = compiler.getTask(output, fileManager, null, 
options, null, compilationUnits1);

        // Create a list to hold annotation processors
        LinkedList<AbstractProcessor> processors = new 
LinkedList<AbstractProcessor>();

        // Add an annotation processor to the list
        processors.add(new VannitationOneToOneProcessor());
        processors.add(new VannitationManyToOneProcessor());

        // Set the annotation processor to the compiler task
        task.setProcessors(processors);

        // Perform the compilation task.
        // the compiler will return false for us because the files we are
        // creating won't compile as
        // we don't have the required fields.
        task.call();

        // now some tests .. we will just validate that
        ...

     }

}}}


So .. to ensure that the processor does not run in my package from maven, and 
that I control it (maven via surefire runs it), I -proc:none on the compile 
test also.

{{{

      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>2.3.2</version>
        <executions>
          <execution>
            <id>default-compile</id>
            <configuration>
              <compilerArgument>-proc:none</compilerArgument>
              <source>1.6</source>
              <target>1.6</target>
            </configuration>
          </execution>
          <execution>
            <id>default-testCompile</id>
            <configuration>
              <compilerArgument>-proc:none</compilerArgument>
              <source>1.6</source>
              <target>1.6</target>
            </configuration>
          </execution>
        </executions>
      </plugin>

}}}



> META-INF/services/javax.annotation.processing.Processor copied before 
> compilation and causes error
> --------------------------------------------------------------------------------------------------
>
>                 Key: MCOMPILER-97
>                 URL: http://jira.codehaus.org/browse/MCOMPILER-97
>             Project: Maven 2.x Compiler Plugin
>          Issue Type: Bug
>    Affects Versions: 2.0.2
>         Environment: Ubuntu 8.10, JDK 6.
>            Reporter: Jesse Glick
>         Attachments: maven-6647998-test.zip
>
>
> It is tricky to compile a Maven module which defines a (269-compliant) 
> annotation processor. If you write the code for the processor in 
> src/main/java and register it in src/main/resources, 
> META-INF/services/javax.annotation.processing.Processor is copied to 
> target/classes first, and then javac is run. But javac is given 
> target/classes in -classpath, so it tries to load the processor, which of 
> course has not been compiled yet - a chicken-and-egg problem.
> The most straightforward workaround is to specify 
> <compilerArgument>-proc:none</compilerArgument> in your POM. This will only 
> work, however, if the module does not use any annotation processors defined 
> in dependencies. If it does, there may be some other trick involving 
> -processorpath and Maven variable substitution to insert the dependency 
> classpath.
> Switching the order of resources:resources and compiler:compile would help - 
> at least a clean build would work - though it could still cause problems in 
> incremental builds. Better would be for the compiler plugin to pass 
> -processorpath based on the dependency classpath (i.e. -classpath minus 
> target/classes) when using -source 1.6 or higher.

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: 
http://jira.codehaus.org/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to