[ 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