Hi Tudor,
Very interesting. This is the first time I heard of lombok, and I would have to look into it more closely. What I find strange is that you get to visit the method (this is where you get the unresolved method declaration from) even if the method does not exist. I am sure I do not understand something. Would you like to open an issue for this?
Actually the lombok issue resolved itself. I found out that lombok provides a delombok functionality (https://projectlombok.org/features/delombok.html ): "Delombok [...] allows you to use lombok with these tools by preprocessing your java code into java code with all of lombok's transformations already applied. [...] Delombok's standard mode of operation is that it copies an entire directory into another directory, recursively, skipping class files, and applying lombok transformations to any java source files it encounters."
So I just have analyse my delomboked source files instead of the original source files and everything will be fine.
The cause of the next problem is that we have multiple smaller
applications (e.g. backoffice and frontend) which are separate applications but share a common db. Some of these services have classes with the same class and packagename (e.g. an annotation WebController). This lead to the following error message:
unresolved annotation type declaration - WebController -
c:\data\moose....\WebController.java - line 12
I had to start the debugger to find the issue. I found it because
AnnotationTypeDeclaration.parent.problems = "Pb(323) The type WebController is already defined"
If the package names are different the problems disappears. Then I only
get the the lombok errors. As a solution I will create unique base package names for my projecfs (which makes sense anyway).
Indeed. The only other solution for this problem is to analyze each sub-project separately. Also, perhaps I can manage to create a better log statement for this case. Would you like to open an issue on github for this?
Note that you could the following example to you README of jdt2famix to
show how to download the dependencies for gradle projects:
task copyDependencies(type: Copy) { from configurations.compile from configurations.testCompile into 'dependencies’ }
Thanks!
Could you also tell me how to actually add this to a gradle script and invoke it? I tried a variation of this (without configurations.testCompile), but I did not manage to run it. I am likely missing something basic here, and perhaps if you would walk me through a concrete example, I could make some progress :). For example, what steps would you use for downloading the dependencies of https://github.com/spring-projects/spring-framework ?
Cheers, Doru
Actually I tested it with the spring gradle file and it worked. The spring build file is a little bit more complicated, because it is a multimodule project. Basically an easy way to find the right place is to define it directly after the dependencies of the java projects. I added it as follows to the configure (allprojects) section:
configure(allprojects) { project -> group = "org.springframework" version = qualifyVersionIfNecessary(version) // ....
task copyDependencies(type: Copy) { from configurations.compile into 'dependencies' } }
If you have a simple project (not a multi module one), there won't exist such a configure method. Then you can define it directly (e.g. after the dependencies). I attached my spring gradle build file to this mail. In my company project, which is a multi module project too, I added it to a configure method which is used for all java projects (we have some non java projects too). If I added to a configure method which is called for all projects due to the non java projects I would get an error. So it seems as if you always have to change you build files and as if there doesn't exist a general solution (like there exists one for maven). But I'm not a gradle expert, so there might exist a better solution.
Best regards Meinert