I have solved the problem! Well, … not exactly! I have found a solution to the
problem!
If you se the output in my previous mail:
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile)
@ repoman-service ---
I was using version 3.1 of the maven-compiler-plugin. I downgraded to version
2.3.2, and now everything works perfectly!
I'd say that there is a bug in version 3.1.
And now again I'm asking myself "Why wasn't that the first thing I tested ?" :-)
/Tommy
20 jul 2013 kl. 15:19 skrev Tommy Svensson <[email protected]>:
> I have found something interesting, and I think maven is at fault here :-).
>
> I first do:
>
> mvn clean install
>
> this works fine. Then I do:
>
> mvn install
>
> which results in the following output:
> …
> [INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @
> repoman-service ---
> [INFO] Changes detected - recompiling the module!
> …
>
> Notice the "Changes detected - recompiling the module!". There should be no
> changes detected at all there! Here are my source and class files with
> timestamps:
>
> Sources:
> Tommys-MacBook-Pro:service tommy$ find src -type f -exec ls -l {} \;
> -rw-r--r-- 1 tommy staff 399 14 Jul 16:43
> src/main/java/se/natusoft/fambda/Fambda.java
> -rw-r--r-- 1 tommy staff 2117 14 Jul 17:43
> src/main/java/se/natusoft/repoman/Activator.java
> -rw-r--r--@ 1 tommy staff 851 10 Jul 17:10
> src/main/java/se/natusoft/repoman/config/RepoManConfig.java
> -rw-r--r--@ 1 tommy staff 187 11 Jul 18:24
> src/main/java/se/natusoft/repoman/repository/RepositoryProvider.java
> -rw-r--r-- 1 tommy staff 554 20 Jul 14:30
> src/main/java/se/natusoft/repoman/service/model/ChangeSet.java
> -rw-r--r-- 1 tommy staff 496 20 Jul 14:30
> src/main/java/se/natusoft/repoman/service/model/CMRepository.java
> -rw-r--r-- 1 tommy staff 379 20 Jul 14:30
> src/main/java/se/natusoft/repoman/service/model/Person.java
> -rw-r--r-- 1 tommy staff 240 19 Jul 12:47
> src/main/java/se/natusoft/repoman/service/provider/RepositoryService.java
> -rw-r--r-- 1 tommy staff 1022 19 Jul 20:31
> src/main/java/se/natusoft/repoman/service/provider/RepositoryServiceProvider.java
>
> Tommys-MacBook-Pro:service tommy$ find target/generated-sources/ -type
> f -exec ls -l {} \;
> -rw-r--r-- 1 tommy staff 564 20 Jul 14:55
> target/generated-sources//annotations/se/natusoft/osgi/aps/tools/aps-activator-data
> -rw-r--r-- 1 tommy staff 1939 20 Jul 14:55
> target/generated-sources//annotations/se/natusoft/repoman/service/model/ChangeSetBean.java
> -rw-r--r-- 1 tommy staff 953 20 Jul 14:55
> target/generated-sources//annotations/se/natusoft/repoman/service/model/CMRepositoryBean.java
> -rw-r--r-- 1 tommy staff 734 20 Jul 14:55
> target/generated-sources//annotations/se/natusoft/repoman/service/model/PersonBean.java
> Classes:
> Tommys-MacBook-Pro:service tommy$ find target/classes -type f -exec ls
> -l {} \;
> -rw-r--r-- 1 tommy staff 1494 20 Jul 14:55
> target/classes/META-INF/MANIFEST.MF
> -rw-r--r-- 1 tommy staff 304 20 Jul 14:55
> target/classes/se/natusoft/fambda/Fambda$func.class
> -rw-r--r-- 1 tommy staff 349 20 Jul 14:55
> target/classes/se/natusoft/fambda/Fambda$func1.class
> -rw-r--r-- 1 tommy staff 392 20 Jul 14:55
> target/classes/se/natusoft/fambda/Fambda$func2.class
> -rw-r--r-- 1 tommy staff 435 20 Jul 14:55
> target/classes/se/natusoft/fambda/Fambda$func3.class
> -rw-r--r-- 1 tommy staff 345 20 Jul 14:55
> target/classes/se/natusoft/fambda/Fambda.class
> -rw-r--r-- 1 tommy staff 1252 20 Jul 14:55
> target/classes/se/natusoft/repoman/Activator.class
> -rw-r--r-- 1 tommy staff 1130 20 Jul 14:55
> target/classes/se/natusoft/repoman/config/RepoManConfig.class
> -rw-r--r-- 1 tommy staff 199 20 Jul 14:55
> target/classes/se/natusoft/repoman/repository/RepositoryProvider.class
> -rw-r--r-- 1 tommy staff 351 20 Jul 14:55
> target/classes/se/natusoft/repoman/service/model/ChangeSet.class
> -rw-r--r-- 1 tommy staff 1877 20 Jul 14:55
> target/classes/se/natusoft/repoman/service/model/ChangeSetBean.class
> -rw-r--r-- 1 tommy staff 363 20 Jul 14:55
> target/classes/se/natusoft/repoman/service/model/CMRepository.class
> -rw-r--r-- 1 tommy staff 1394 20 Jul 14:55
> target/classes/se/natusoft/repoman/service/model/CMRepositoryBean.class
> -rw-r--r-- 1 tommy staff 339 20 Jul 14:55
> target/classes/se/natusoft/repoman/service/model/Person.class
> -rw-r--r-- 1 tommy staff 865 20 Jul 14:55
> target/classes/se/natusoft/repoman/service/model/PersonBean.class
> -rw-r--r-- 1 tommy staff 152 20 Jul 14:55
> target/classes/se/natusoft/repoman/service/provider/RepositoryService.class
> -rw-r--r-- 1 tommy staff 1204 20 Jul 14:55
> target/classes/se/natusoft/repoman/service/provider/RepositoryServiceProvider.class
>
> All classes have 14:55 as timestamp. All sources under src/main/java is
> younger than that! The generated sources under target/generated-sources/...
> have the same timestamp as the classes, which is not that surprising.
> Recompile should only be done if any sources are newer, not the same time. So
> what is making maven-compiler-plugin think that it needs to recompile this ?
>
> My previous question of what triggers an annotation processor was stupid :-)
> An annotation processor is of course always triggered when a source having
> its annotation is compiled.
>
> Regards, Tommy
>
>
> 20 jul 2013 kl. 12:31 skrev Tommy Svensson <[email protected]>:
>
>> Hello Russ,
>>
>> No, the sources are only generated once. I've double checked that. That was
>> my first thought.
>>
>> It just occurred to me that I have a unit test with an annotated model in my
>> annotation processor project and it behaves correctly (I just did some
>> tests). There the annotation processor is not run if the processed
>> annotations have not been modified, which is entirely correct. If I change
>> something in the annotation and build again (without doing clean) it
>> regenerates and compiles fine without duplicate class exception. The problem
>> in my other code where I have the problem is, I just realized that the
>> annotation processor is run when it should not be!
>>
>> When I do "mvn install" and then directly a new "mvn install" nothing what
>> so ever have changed in the annotations being processed! Still the
>> annotation processor is triggered for some reason in this case! The
>> interesting question here is how does the annotation processor framework
>> determine if a processor needs to run or not ? It can't have a clue about
>> what the processor will be generating, so how does it determine this ? Also,
>> this invocation when it shouldn't only occurs when built with maven, but I
>> realize that does not necessarily mean that maven is at fault. Hmm. I have
>> some more troubleshooting to do here.
>>
>> /Tommy
>>
>>
>> 19 jul 2013 kl. 18:33 skrev Russell Gold <[email protected]>:
>>
>>> Hi Tommy,
>>>
>>> I am not seeing this problem, myself.
>>>
>>> When you get the duplicate class problem, do you find multiple copies of
>>> the generated source in your target directory? Multiple copies of the same
>>> class files? AFAIK that is the only way you should ever see a duplicate
>>> class exception
>>>
>>> - Regards,
>>> Russ
>>>
>>> On Jul 19, 2013, at 11:40 AM, Tommy Svensson <[email protected]> wrote:
>>>
>>>> Hello Russ,
>>>>
>>>> No, that is not exactly my case. I just tried to build from the IDE to
>>>> confirm my suspicion that the problem only occurred in maven. I'm using
>>>> Intellij Idea 12 and it is nice enough to recognize that my project is a
>>>> maven project. When I tell it to "make" or "rebuild" it does build itself
>>>> not using maven, but it uses the same target paths as maven would. It
>>>> tries to avoid the problem you describe.
>>>>
>>>> My problem is that as long as I build with maven I have to do a "mvm clean
>>>> install" every time since an "mvn install" … "mvn install" will fail on
>>>> the second install with a duplicate class exception for the generated
>>>> code. As I said, I suspect that maven have already built the previously
>>>> generated classes before annotation procession is run by maven and when
>>>> the annotation processor produces new versions of the same classes they
>>>> are compiled again and produces exactly the same class file targets as
>>>> already produced before during the build. This causes the duplicate class
>>>> exception. That is at least my theory.
>>>>
>>>> /Tommy
>>>>
>>>>
>>>> 19 jul 2013 kl. 17:28 skrev Russell Gold <[email protected]>:
>>>>
>>>>> Hi Tommy,
>>>>>
>>>>> I've run into some problems along these lines, but in my case, it only
>>>>> happens when I build first using Maven and then try to recompile in the
>>>>> IDE. The problem appears to be that the two disagree on where the
>>>>> generated classes go (there was a change in one of the JDK releases, I
>>>>> believe).
>>>>>
>>>>> I work around that by doing a clean compile in maven before starting IDE
>>>>> work.
>>>>>
>>>>> Is that your problem? Or are you only seeing this by only doing repeated
>>>>> Maven builds? I don't have that problem.
>>>>>
>>>>> - Russ
>>>>>
>>>>> On Jul 19, 2013, at 11:22 AM, Tommy Svensson <[email protected]> wrote:
>>>>>
>>>>>> Hello,
>>>>>>
>>>>>> I have found a problem when using auto triggered annotation processors
>>>>>> (META-INF/services/javax.annotation.Processor) with maven builds! The
>>>>>> problem occurs when the code have been built once and the annotation
>>>>>> processors have been triggered and generated code. If I then build
>>>>>> again without doing a clean in between then I get a duplicate class
>>>>>> exception for each generated class. I suspect this is because maven have
>>>>>> already build the previous versions before annotation processing is
>>>>>> triggered and when the newly updated/generated sources are compiled it
>>>>>> conflicts the the previous built classes.
>>>>>>
>>>>>> This problem does not occur when I build in the IDE not using maven.
>>>>>> Then the annotation processing behaves as expected. I suspect that if
>>>>>> the processor weren't specified in
>>>>>> META-INF/services/javax.annotation.Processor, and was run manually with
>>>>>> apt-maven-plugin it would work better, but that is not an option. I
>>>>>> wan't my processor to be able to be used the standard Java way, and with
>>>>>> maven, without having 2 versions of it. I have found a way to identify
>>>>>> in the processor when there already are old sources available and don't
>>>>>> regenerate then, which will make it run in maven, but will then not
>>>>>> update the generated sources without first doing a clean when
>>>>>> annotations are updated. This is of course not a good solution.
>>>>>>
>>>>>> Is there any other known way to solve this problem with maven ? I'm
>>>>>> using version 3.1 of the maven-compiler-plugin.
>>>>>>
>>>>>> Any help is appreciated.
>>>>>>
>>>>>> Best Regards,
>>>>>> Tommy Svensson
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>> ---------------------------------------------------------------------
>>>>>> To unsubscribe, e-mail: [email protected]
>>>>>> For additional commands, e-mail: [email protected]
>>>>>>
>>>>>
>>>>> -----------------
>>>>> Come read my webnovel, Take a Lemon <http://www.takealemon.com>,
>>>>> and listen to the Misfile radio play
>>>>> <http://www.gold-family.us/audio/misfile.html>!
>>>>>
>>>>>
>>>>>
>>>>>
>>>>
>>>>
>>>> ---------------------------------------------------------------------
>>>> To unsubscribe, e-mail: [email protected]
>>>> For additional commands, e-mail: [email protected]
>>>>
>>>
>>> -----------------
>>> Come read my webnovel, Take a Lemon <http://www.takealemon.com>,
>>> and listen to the Misfile radio play
>>> <http://www.gold-family.us/audio/misfile.html>!
>>>
>>>
>>>
>>>
>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: [email protected]
>> For additional commands, e-mail: [email protected]
>>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [email protected]
> For additional commands, e-mail: [email protected]
>
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]