Location of generated source files for maven directory structure
As much as i know there is no standard folder structure for generated sources. In my projects, i prefer src/gen/java
kind of notation.
I think the location depends on how the source is generated and handled.
The source code is generated automatically during the build process: Then i would use
target/main/java/
,target/test/java/
and so on. This code is not checked in into CVS since you can rebuild it fairly easy. In case you clean your project thetarget
directory will be removed and the source will be rebuild.The source code is generated manually by an external tool or similar: I would use
generated/src/main/java/
,generated/src/test/java/
,generated/src/main/resources/
and so on. This code should be checked in. A benefit is, as soon you see that the top-level directory name isgenerated
you know that all files/directories below are also generated. Also you have the standard maven directory structure under the top-level directory. Another point is that clean-up is easy, just deletegenerated
and recreate it, without looking through many other directories (like in your example:src/main/generated-java
and src/test/generated-java).
EDIT: Another nice solution would be to create a maven project which only contains the generated source like myproject-generated-1.0.3.jar
. This project would be a dependency in your real application. Then you would just put your generated source int src/main/java
.
I totally agree with the accepted answer. I just want to offer a slightly different suggestion for naming the directory that contains code generated by third-party tools:
src-gen/main/java
Background: In the Eclipse/Maven Tycho world (where code/resource generation often plays a large role) there is the src-gen
directory for generated code, which has been established as some kind of standard convention. (the default project layout is a bit different compared to Maven, as all source files are directly in src
and src-gen
).
In a Maven project that could be translated for example to src-gen/main/java
, src-gen/main/resources
, src-gen/test/java
, src-gen/test/resources
. I like that more than moving everything into a "generated" directory, because
- Sources in
src/main/java
andsrc-gen/main/java
are on the same depth in the directory tree - It's more clear that
src-gen
contains generated sources/resources that contribute to the build. On the other hand a folder just named "generated" dosn't tell you much about its content. It could contain anything, like generated documentation or generated test data or it could be just a temporary folder. - All the mentioned advantages of
generated/src/main/java
still apply (e.g. easy cleanup) - After a quick google search it looks like there are already projects on Github that use this pattern
Some thoughts/opinions about the other suggestions from the question:
- Instead of
/src/main/generated-java
I would probably rather go with something like/src/main/java-gen
which, when sorting directories alphabetically, keeps generated and regular code next to each other (<lang>-gen
is also another pattern already used in Eclipse projects) - In my opinion
gen
fits in with the brief official names likesrc
,it
etc. more thangenerated
. I've already seensrc/gen/java
a few times in the wild and have the feeling it is a more common than/src/generated/java
. On the other hand some Maven plugins use the quite verbosetarget/generated-sources/<lang>
directory, sogenerated-sources/main/java
could also be an option if your not into short names...
Ultimately I think the naming doesn't matter that much and it is up to your preference since none of this is "official" convention.