1
votes

Le projet Maven obtient la version d'un autre projet maven?

Je dois maven projets client et serveur. La version du serveur est toujours la version du client. Cette "version" n'est pas la version de l'artefact maven du client. Est plus une propriété du client que j'en ai besoin dans le serveur. Il est créé à partir d'une propriété du pom et du numéro de build ou "trunk-snapshot" (lorsque le client est construit sur la machine du développeur).

La version client est créée à l'heure de la construction (build Jenkins ou installation propre mvn localement). J'ai besoin de lire la version du client sur le module serveur en utilisant Java.

Quelle serait la meilleure approche?

J'ai essayé de créer un fichier texte comme artefact du client, mais je n'ai pas trouvé de moyen facile de le lire sur le serveur.


3 commentaires

Faites-vous simplement référence à deux projets maven lorsque vous avez mentionné le projet client et le projet serveur? Existe-t-il un projet parent qui construit ces deux projets ou sont-ils complètement indépendants et construits séparément sur deux machines distinctes?


Oui deux projets maven qui ont le même parent. Mais ils peuvent être construits séparément. Nous avons un artificiel généralement construit sur la même machine.


Vous devriez pouvoir définir une propriété dans le pom parent et faire référence dans les modules, j'ai ajouté un exemple en tant que réponse ci-dessous.


3 Réponses :


2
votes

Consultez la documentation POM ici: https: // maven .apache.org / guides / introduction / introduction-au-pom.html . Regardez plus précisément l'agrégation de projets: https: // maven. apache.org/guides/introduction/introduction-to-the-pom.html#Project_Aggregation

Ce que vous voulez probablement, c'est un POM parent qui a alors un module pour le client et un module pour le serveur.

La structure de votre projet ressemblera à ceci:

./pom.xml <-- this is your parent pom, it has version info, module entries for client/server, and dependencies that are used by both the client and server
./server
./server/pom.xml <- this is the pom for your server
./client
./client/pom.xml <- this is the pom for your client

Vous pouvez alors définir la version dans votre pom parent et votre client et votre serveur en hériteront. Pour définir votre numéro de build, vous pouvez utiliser une solution comme lkamal suggère en modifiant votre propriété de version Maven.

Une autre option à considérer est la façon dont vous générez vos numéros de build. Le Plugin de numéro de build pour Maven peut générer un numéro de build séquentiel arbitraire ou générez-en un à partir de la version SCM.


6 commentaires

Je ne pense pas que cela m'aide. La version est créée uniquement au moment de la construction et ce n'est pas la version de l'artefact.


Générez-vous cette version en utilisant du code ou en utilisant quelque chose comme le numéro de version du contrôle de source? Dans ce dernier cas, utilisez le plugin maven build number pour générer cette version dans le cadre de la version de votre projet. mojohaus.org/buildnumber-maven-plugin/usage.html


Une fois le client construit, comment puis-je obtenir la version sur le serveur en utilisant Java?


Ok donc votre code fait quelque chose comme une vérification de cohérence pour s'assurer que la version du client appelant un serveur correspond à la version du serveur. Voici quelques stratégies à cet effet: stackoverflow.com/questions/3697449/… . Je vais y réfléchir un peu et poster en retour. Je pense que vous avez 3 ou 4 sous-tâches pour résoudre votre cas d'utilisation global.


Oui, quelque chose comme ça. L'application ne fonctionne que si le client et le serveur ont la même version.


J'ai trouvé une solution en utilisant properties-maven-plugin dans le client pour créer un fichier de propriétés qui se retrouvera dans client.jar. Et celui-là, je l'ai lu sur le serveur en utilisant ClassLoader.getSystemResourceAsStream ("my.properties")



4
votes

La solution la plus simple serait de définir une propriété dans votre fichier pom parent et de la référencer dans les modules client et serveur.

<version-needed-tag>${my.custom.version}</version-needed-tag>

Le parent pom.xml aura maintenant ci-dessous.

<properties>
    <my.custom.version>1234</my.custom.version>
</properties>

Dans les fichiers pom.xml serveur et client, vous pouvez le faire référence comme ci-dessous.

pom.xml
server/pom.xml
client/pom.xml


7 commentaires

comment puis-je mettre à jour la propriété lorsque je construis le client?


Une option consiste à transmettre la valeur de la propriété via la ligne de commande. mvn clean install -Dmy.custom.version = 1234


K, cela mettra à jour la propriété des artefacts du client, puis comment puis-je obtenir cette propriété pour le module serveur en utilisant java?


Lorsque vous construisez les deux modules client et serveur en utilisant le pom parent, vous devrez passer la propriété via la ligne de commande. Ensuite, les deux sous-modules recevront la même valeur pour la propriété.


oui, cela fonctionne, mais mon principal problème est que la plupart du temps, ils sont construits séparément, donc j'ai besoin d'un module way @ server pour lire la version du ou des artefacts client


Ainsi, lorsque vous construisez l'artefact client, une valeur de propriété sera présente et un artefact sera généré. Ensuite, lors de la création de l'artefact serveur, vous souhaitez faire référence à l'artefact client et découvrir la valeur de propriété utilisée dans l'artefact client. Ai-je bien compris votre question?


oui, maintenant j'essaye cette solution stackoverflow.com/questions/33821074/...



0
votes

Je l'ai résolu en utilisant properties-maven-plugin dans le client pour créer un fichier de propriétés, qui se terminera dans client.jar. Je l'ai lu sur le serveur en utilisant ClassLoader.getSystemResourceAsStream ("my.properties").


0 commentaires