Doma uses the Pluggable Annotation Processing API to automatically generate DAO implementation classes and entity auxiliary classes at compile time. Java files are automatically generated by Doma, but even if you create a source JAR by the method normally (?) Introduced in Maven or Gradle (see the link below), the automatically generated Java files are the source. Not included in the JAR.
Entities that are mapped one-to-one with a table are generated by Doma-Gen and collectively referenced in a JAR from a Web project or batch project. At that time, there is a motivation to include the Java file automatically generated by Doma in the source JAR of the entity.
Here, I will describe how to include Java files automatically generated by Doma in the source JAR for Maven and Gradle respectively.
Maven
To create a source JAR in Maven, run the jar
goal of ʻorg.apache.maven.plugins: maven-source-plugin`.
Since the target of packaging is src / main / java
and src / main / resources
, it seems good to add the output directory of the Java file automatically generated by Doma there.
With that in mind, I looked at the jar
goal documentation, but I can add packaging targets. I couldn't find such an option.
There is no choice but to implement the jar
goal [SourceJar Mojo](https://github.com/apache/maven-source-plugin/blob/maven-source-plugin-3.0.1/src/main/java/ I looked at org / apache / maven / plugins / source / SourceJarMojo.java).
SourceJarMojo
is [SourceJarNoForkMojo](https://github.com/apache/maven-source-plugin/blob/maven-source-plugin-3.0.1/src/main/java/org/apache/maven/plugins/ It inherited from source / SourceJarNoForkMojo.java).
In SourceJarNoForkMojo
, [where the source directory (the target of packaging) is acquired](https://github.com/apache/maven-source-plugin/blob/maven-source-plugin-3.0.1 Looking at /src/main/java/org/apache/maven/plugins/source/SourceJarNoForkMojo.java#L73), MavenProject # getCompileSourceRoots ()
is called.
Javadoc of MavenProject # getCompileSourceRoots () It was not written, but it seems to be a setting related to the entire project from the class name etc.
From the above, I decided to add the output destination of the Java file automatically generated by Doma as a resource directory.
<resources>
<resource>
<filtering>false</filtering>
<directory>src/main/resources</directory>
</resource>
<resource>
<filtering>false</filtering>
<!--
Default output destination of source code generated by Pluggable Annotation Processing API
Sources by adding to the resource directory-Include in jar.
https://maven.apache.org/plugins/maven-compiler-plugin/compile-mojo.html#generatedSourcesDirectory
-->
<directory>${project.build.directory}/generated-sources/annotations</directory>
</resource>
</resources>
However, Maven copies the resources, compiles them, and packages them in a JAR, so if you do mvn package
several times, the second and subsequent JARs (those whose class files are packaged, not the source JAR) The Java file automatically generated by Doma will also be packaged in the JAR).
Therefore, I added a setting that does not include Java files in the package in the setting of ʻorg.apache.maven.plugins: maven-jar-plugin`.
<!--
I added the source directory to the resource so it's in a JAR file
Avoid including Java files.
-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<excludes>
<exclude>**/*.java</exclude>
</excludes>
</configuration>
</plugin>
All you have to do now is mvn package source: jar
.
Gradle
Unlike Maven, Gradle does not have a plugin to create a source JAR, but defines a task to create a source JAR by yourself based on the Jar
task.
At that time, add the output destination of the Java file automatically generated by Doma to the package target directory.
In Gradle, the default destination for Java files automatically generated by Doma is sourceSets.main.output.classesDirs
.
Since this is also the output destination of the class file, write the settings excluding the class file.
task sourcesJar(type: Jar) {
from sourceSets.main.allJava, sourceSets.main.output.classesDirs //The source generated by Doma is sourceSets.main.output.Output to classesDirs
classifier = 'sources'
exclude '**/*.class' //sourceSets.main.output.classesDirs also includes class files, so filter
}
As mentioned above, Java files that are automatically generated by Doma (or rather generated using the Pluggable Annotation Processing API) are output in the same location as the class files. Therefore, the Java file is packaged in the JAR file by default, so add a setting that excludes it (why is it output to such a location by default?).
//sourceSets.main.output.Excluding Java files output to classesDirs
jar.excludes = ['**/*.java']
With this, all you have to do is gradle build sources Jar
.
The working code example is in the following location.
You can even experience deploying the source JAR to your local Nexus.
Recommended Posts