Related question
How to configure IntelliJ IDEA and/or Maven to automatically add directories with Java source code generated using jaxb2-maven-plugin?
I have a custom plugin that generates sources under target/generated-sources
(Note no toolname here). So I get sources like target/generated-sources/com/mycompany
...etc.
This format cannot be changed at all, so will I be able to configure Intellij into adding it as a source folder. As of now, I can see that Intellij has added target/generated-sources/com
as the source folder.
Please note that I do not have the option of configuring the plugin !
UPDATE 1: I do not agree with the fact that I MUST put my generated sources under a tool name folder. It may be a good convention, but if I have only one generator there is no need for me to put it there? Again, in my pom.xml I have a resources
section which clearly indicates that target/generated-sources
should be treated as a source folder. This works perfectly fine in Eclipse so I have no idea why Intellij would not respect my settings.
TL;DR -> When I put target/generated-sources
in the resource section of pom.xml
why is Intellij overzealous to add target/generated-sources/com
to the classpath?
You can just change the project structure to add that folder as a "source" directory.
Project Structure → Modules → Click the generated-sources
folder and make it a sources
folder.
Or:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<version>1.4</version>
<executions>
<execution>
<id>test</id>
<phase>generate-sources</phase>
<goals>
<goal>add-source</goal>
</goals>
<configuration>
<sources>
<source>${basedir}/target/generated-sources</source>
</sources>
</configuration>
</execution>
</executions>
</plugin>
I use Maven (SpringBoot application) For this, solution
- Right click project folder
- Select Maven
- Select Generate Sources And Update Folders
Then, Intellij automatically import generated sources to project.
With gradle, the project settings will be cleared whenever you refresh the gradle settings. Instead you need to add the following lines (or similar) in your build.gradle, I'm using kotlin so:
sourceSets {
main {
java {
srcDir "${buildDir.absolutePath}/generated/source/kapt/main"
}
}
}
The fix
Go to Project Structure - Modules - Source Folders and find the target/generated-sources/antlr4/com/mycompany
- click Edit properties and set Package prefix to com.mycompany
.
This is exactly the reason why we can set Package prefix on source dirs.
Different but related problem here
Whoever wrote that plugin screwed up big time. That's not the way to do it!
Any workaround would be a huge hack, make the plugin developer aware of his bug.
Sorry, that's the only thing to do.
OK here's a hack, directly after your plugin's execution, use the antrun plugin to move the directory somewhere else:
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.6</version>
<executions>
<execution>
<phase>process-sources</phase>
<configuration>
<target>
<move todir="${project.build.directory}/generated-sources/toolname/com"
overwrite="true">
<fileset dir="${project.build.directory}/generated-sources/com"/>
</move>
</target>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
In this example, toolname
should be replaced by anything that uniquely identifies the plugin that created the code and com
stands for the root of the created packages. If you have multiple package roots, you probably need multiple <move>
tasks.
But if the plugin adds the folder as source folder, then you're screwed.
Maybe you can add a step to the generate-sources phase that moves the folder?
I had the same issue with Eclipse a couple of months ago when importing my project. Now I had the same with intelliJ.
Here is how someone helped me to solve this in IntelliJ:
Menu => View => Tools windows => Maven Project
In the spring_user value => Run Configuration, choose clean install.
This should do a clean install and after this you should be able to see the classes