[JAVA] Inclure le code source généré par Doma dans le JAR source

Aperçu

Doma utilise l'API Pluggable Annotation Processing pour générer automatiquement des classes d'implémentation DAO et des classes auxiliaires d'entité au moment de la compilation. Les fichiers Java sont automatiquement générés par Doma, mais même si vous créez un JAR source en utilisant la méthode normalement (?) Introduite dans Maven ou Gradle (voir le lien ci-dessous), le fichier Java généré automatiquement est la source. Non inclus dans le JAR.

Les entités qui sont mappées un à un avec une table sont générées par Doma-Gen et référencées collectivement à partir d'un projet Web ou d'un projet par lots dans JAR. À ce moment-là, il y a une motivation pour inclure le fichier Java généré automatiquement par Doma dans le JAR source de l'entité.

Nous décrivons ici comment Maven et Gradle peuvent chacun inclure des fichiers Java générés automatiquement par Doma dans le JAR source.

Maven

Pour créer un JAR source dans Maven, exécutez l'objectif jar de ʻorg.apache.maven.plugins: maven-source-plugin`.

Puisque la cible de l'empaquetage est src / main / java et src / main / resources, il semble bon d'y ajouter le répertoire de destination de sortie du fichier Java généré automatiquement par Doma. Dans cet esprit, j'ai regardé le Document d'objectif jar, mais je peux ajouter des cibles d'empaquetage. Je n'ai pas trouvé une telle option.

Il n'y a pas d'autre choix que d'implémenter l'objectif jar [SourceJar Mojo](https://github.com/apache/maven-source-plugin/blob/maven-source-plugin-3.0.1/src/main/java/ J'ai regardé org / apache / maven / plugins / source / SourceJarMojo.java). SourceJarMojo est [SourceJarNoForkMojo](https://github.com/apache/maven-source-plugin/blob/maven-source-plugin-3.0.1/src/main/java/org/apache/maven/plugins/ Il a hérité de source / SourceJarNoForkMojo.java). Dans SourceJarNoForkMojo, [où le répertoire source (la cible de l'empaquetage) est obtenu](https://github.com/apache/maven-source-plugin/blob/maven-source-plugin-3.0.1 En regardant /src/main/java/org/apache/maven/plugins/source/SourceJarNoForkMojo.java#L73), MavenProject # getCompileSourceRoots () est appelé. Javadoc of MavenProject # getCompileSourceRoots () Cela n'a pas été écrit, mais cela semble être un paramètre lié à l'ensemble du projet, à en juger par le nom de la classe et ainsi de suite.

De ce qui précède, nous avons décidé d'ajouter la destination de sortie du fichier Java généré automatiquement par Doma en tant que répertoire de ressources.

<resources>
    <resource>
        <filtering>false</filtering>
        <directory>src/main/resources</directory>
    </resource>
    <resource>
        <filtering>false</filtering>
        <!--
La destination de sortie par défaut du code source généré par l'API Pluggable Annotation Processing
Sources en ajoutant au répertoire de ressources-Inclure dans le pot.
        https://maven.apache.org/plugins/maven-compiler-plugin/compile-mojo.html#generatedSourcesDirectory
        -->
        <directory>${project.build.directory}/generated-sources/annotations</directory>
    </resource>
</resources>

Cependant, Maven copie les ressources, les compile et les conditionne dans JAR, donc si vous faites plusieurs fois mvn package, le deuxième JAR et les suivants (ceux dont les fichiers de classe sont emballés, pas le JAR source) Le fichier Java généré automatiquement par Doma sera également conditionné en JAR).

Par conséquent, j'ai ajouté un paramètre qui n'inclut pas les fichiers Java dans le package dans le paramètre de ʻorg.apache.maven.plugins: maven-jar-plugin`.

<!--
J'ai ajouté le répertoire source à la ressource, donc dans le fichier JAR
N'incluez pas de fichiers Java.
-->
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <configuration>
        <excludes>
            <exclude>**/*.java</exclude>
        </excludes>
    </configuration>
</plugin>

Tout ce que vous avez à faire maintenant est mvn package source: jar.

Gradle

Contrairement à Maven, Gradle n'a pas de plug-in pour créer un JAR source, mais définit une tâche pour créer un JAR source par vous-même en fonction de la tâche Jar.

À ce moment, vous pouvez ajouter la destination de sortie du fichier Java généré automatiquement par Doma dans le répertoire cible du package.

Dans Gradle, la destination par défaut des fichiers Java générés automatiquement par Doma est sourceSets.main.output.classesDirs. Comme il s'agit également de la destination de sortie du fichier de classe, écrivez les paramètres en excluant le fichier de classe.

task sourcesJar(type: Jar) {
    from sourceSets.main.allJava, sourceSets.main.output.classesDirs //La source générée par Doma est sourceSets.main.output.Sortie vers classesDirs
    classifier = 'sources'
    exclude '**/*.class' //sourceSets.main.output.classesDirs inclut également des fichiers de classe, donc filtrez
}

Comme mentionné ci-dessus, les fichiers Java générés automatiquement par Doma (ou plutôt générés à l'aide de l'API de traitement d'annotations enfichables) sont sortis au même emplacement que les fichiers de classe. Par conséquent, le fichier Java est empaqueté dans le fichier JAR par défaut, ajoutez donc un paramètre qui l'exclut (pourquoi est-il sorti à un tel emplacement par défaut?).

//sourceSets.main.output.Exclusion des fichiers Java sortis vers classesDirs
jar.excludes = ['**/*.java']

Avec cela, tout ce que vous avez à faire est de gradle build sources Jar.

À la fin

L'exemple de code de travail se trouve à l'emplacement suivant.

Vous pouvez même expérimenter le déploiement du JAR source sur votre Nexus local.

Recommended Posts

Inclure le code source généré par Doma dans le JAR source
Comment déboguer le fichier jar généré avec Eclipse
Lors de la lecture du code source
Devinez le code de caractère en Java
Code source pré-écrit pour l'activité
Inclure les ressources d'image dans le fichier jar
[Exemple de référence] Le droit d'auteur est décrit dans le commentaire du code source.
Que faire si vous n'aimez pas le code généré par swagger-codegen-cli
J'ai vérifié le nom du package référencé par la classe contenue dans le fichier JAR
L'application absorbe la différence de code de caractère
Trier par plusieurs champs dans la classe
Empêcher les erreurs dans le nom de l'enregistreur en copiant
Techniques de lecture du code source Java dans Eclipse
[Java] Jugement en saisissant des caractères dans le terminal