Comment faire un plugin architecture praticable?

0

La question

Nous avons un couple d'anciens projets Java, qui nous nous sommes convertis à des projets Maven / modules. Auparavant, tous les projets ont été NetBeans projets et n'avait pas de véritable gestion de la dépendance. Dépendances externes existait sur le réseau d'entreprises en voiture et ont été directement inclus comme Pots dans NetBeans projets de chaque module. Pour les dépendances internes, projet simple, les références ont été utilisées. C'était une douleur pour construire tout ce que parce que le programmeur avait de tout construire dans le bon ordre.

Maintenant, nous sommes dans la position que l'on peut ouvrir tous les modules Maven dans IntelliJ IDEA et NetBeans. Cependant, j'ai du mal à comprendre la meilleure façon de combiner les différents modules et dépendances externes de manière spécifique, ce qui est conforme à l'plugin forme de la structure. Surtout avec NetBeans (en développement avec à la fois des IDEs doit être possible).

Voici comment les dépôts git / structure de projet ressemble plus ou moins. La structure du dossier des modules est la valeur par défaut de Maven structure pour chaque module. La fonctionnalité de liste de ce site a été trop maladroit, je l'ai donc inclus en tant que capture d'écran...

Structure Git Repos

Nous avons une repository maven pour les trucs et construire avec maven, etc. est de travail. Pour Intellij IDÉE que j'ai d'exécuter et de déboguer le produit final pour customer1 via un custom configuration d'exécution, qui copie les fichiers nécessaires dans la structure nécessaire:

enter image description here

Avec IntelliJ IDEA, je peux déboguer le logiciel, mais je pense que l'approche (personnalisé IntelliJ exécuter config que j'ai créé, en montrant tous besoin de Pots et des fichiers directement) est assez moche, et pour NetBeans je ne pouvais pas trouver un semblable "run configuration" mécanisme.

J'ai donc essayé de réaliser ce processus de construction par la création d'un nouveau "Customer1Runnable" projet Maven comme une sorte de description de compilation, qui pointe à tous les besoin de Maven modules. Sur cette base, j'ai cru que je pouvais atteindre et automatisme pour créer le logiciel structure. Ergo copie de tous les modules dans un dossier du plugin et de toutes les dépendances des modules dans un dossier lib à l'intérieur de la Customer1Runnable projet, en utilisant le maven-assembly-plugin.

Tout d'abord, est mon hypothèse correcte que c'est un possible cas d'utilisation pour le maven-assembly-plugin?

Le projet lui-même n'a pas de fichiers source, c'est seulement une pom.xml et la assembly-config.xml descripteur. J'ai attaché l'assembly-plugin pour le paquet de phase. Lors de l'exécution de la mvn package commande tous les modules sont construits, mais pour l'exécution de l'assemblée-plugin-je obtenir la sortie suivante:

Windows CMD output of Customer1Runnable maven project

Pour commencer, j'ai seulement essayé d'inclure un module dans l'assemblée descripteur. C'est le XML (opicom-assembly.xml) pour cela:

<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.1.0"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.1.0 http://maven.apache.org/xsd/assembly-2.1.0.xsd">
    <id>opicom-assembly</id>
    <formats>
        <format>dir</format>
    </formats>
    <includeBaseDirectory>false</includeBaseDirectory>
    <moduleSets>
        <moduleSet>
            <useAllReactorProjects>true</useAllReactorProjects>
                <includes>
                    <include>my.company.reporting:module1</include>
                </includes>
        </moduleSet>
    </moduleSets>
</assembly>

pom.xml de Customer1Runnable projet

 <?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <version>1.6</version>
    <groupId>my.company.customer1</groupId>
    <artifactId>OpicomRunnable</artifactId>
    <packaging>pom</packaging>
    <name>OpicomRunnable</name>
    
    <repositories>
        <repository>
            <id>Company-Maven-Repo</id>
            <url>file:\\\\MyCompany\TFSDrop\MavenRepo</url>
        </repository>
    </repositories>
    
    <modules>
        <module>../my.company.customer1.module1</module>
        <module>../my.company.customer1.module2</module>
        .
        .
        .
        <module>../../MyCompany_Common/Report/my.company.reporting.module1</module>
    </modules>  
    <build>
        <plugins>
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>3.3.0</version>
                <inherited>true</inherited>
                <executions>
                    <execution>
                        <id>copy-dependencies</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <descriptors>
                        <descriptor>opicom-assembly.xml</descriptor>
                    </descriptors>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

Le pom du module ressemble à ceci:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>my.company</groupId>
        <artifactId>reporting</artifactId>
        <version>1.3</version>
        <relativePath>../pom.xml</relativePath>
    </parent>

    <artifactId>module1</artifactId>
    <version>1.3</version>
    <packaging>jar</packaging>



    <dependencies>
        <!-- external dependencies -->
        <dependency>
            <groupId>commons-pool</groupId>
            <artifactId>commons-pool</artifactId>
            <version>1.6</version>
        </dependency>
        <dependency>
            <groupId>com.oracle.database.jdbc</groupId>
            <artifactId>ojdbc8</artifactId>
            <version>21.1.0.0</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>3.3.0</version>
                <configuration>
                    <finalName>my-company-${project.artifactId}</finalName>
                    <appendAssemblyId>false</appendAssemblyId>
                    <outputDirectory>../build</outputDirectory>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

Merci pour toute entrée sur ce que je fais de mal ici / comment réaliser cela avec Maven.

EDIT: Comme demandé, voici un exemple de projet en tant que Fichier ZIP. https://drive.google.com/drive/folders/1ilJeTrOPgYgUTdOP0J4BQcBnPT5fls0k?usp=sharing Les répertoires parents ModuleGroupCustomer et ModuleGroupCommon ne représentent dépôts git dans le scénario réel. La relative chemin d'accès du module est causé, parce que le projet maven qui devrait être mon "run configuration" points à projets maven dans les deux référentiels.

Je suis peut-être un malentendu Maven en général? J'y ai pensé en termes de cas d'utilisation pour la gestion de la dépendance similaire .Net les packages nuget, mais aussi comme "configuration de projet" comme ordinaire NetBeans/Intellij projets.

Est-il préférable de simplement tenir à l'existant NetBeans projets au jour le jour le développement?

1

La meilleure réponse

0

Après un long et fastidieux processus d'essais et d'erreurs, j'ai trouvé une solution qui fonctionne pour moi. J'ai donc décidé de partager la solution en ligne, au cas où quelqu'un d'autre se heurte à un problème similaire. Voici un lien vers la dernière archive zip contenant de travail exemple des projets => Fichier CustomerRunnable_RunningAssemblyPluginStackoverflowExample.zip https://drive.google.com/drive/u/0/folders/1ilJeTrOPgYgUTdOP0J4BQcBnPT5fls0k

Mon erreur est que j'ai mal compris comment l'assembly-plugin fonctionne. L'approche que j'ai exécuté le plugin dans mon agrégateur pom (CustommerRunnable) est erroné, car ce projet maven existe seulement en tant que parent pom.

Le CustommerRunnable pom.xml les références de tous les clients plugins modules. Ces modules n'ont pas le CustommerRunnable en tant que parent, mais d'une autre pom. Ensuite, j'ai créé une projet maven "distribution". L'pom.xml de la distribution définit tous les plugins (besoin client maven modules) comme des dépendances. Il a également la CustommerRunnable pom.xml en tant que parent. Donc quand je lance le projet dans NetBeans, tous les modules connectés sont également construire(si nécessaire).

Il configure également l'assemblée plugin. L'assemblée plugin est attaché à la maven paquet de phase et donc exécuté avec elle. Il utilise également un assembly personnalisé descripteur, qui copie tous définies précédemment plugins dans les dossiers de droit. Ceci est fait en utilisant dependencySets à inclure et exclure des modèles. Voir https://maven.apache.org/plugins/maven-assembly-plugin/advanced-descriptor-topics.html pour plus de détails sur cette. Donc, on dependencySet des copies de tous les fichiers jar de tous les plugins d'un /plugin dossier à l'aide d'un include modèle. Ensuite, cette approche est inversée pour copier les fichiers jar de toutes les dépendances externes à un /lib dossier.

Le descripteur définit également des fichiers à copier à un emplacement particulier. exec-maven-plugin, donc je peux aisément démarrer le logiciel client de NetBeans. Je n'ai pas encore gérer pour configurer l'exécution du plugin correctement quant à la nécessaire classpath arguments.

Endresult ressemble à ceci: Assembly folder after building

Il est également intéressant de noter que la configuration du "projet de construction", "l'Exécution du projet" et "Debug du projet" à l'intérieur de NetBeans besoin d'un petit peu de modification. (Clic droit sur le Module "distribution" -> "Propriétés" -> point "Actions"

2021-11-25 17:07:28

Dans d'autres langues

Cette page est dans d'autres langues

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................