Utiliser maven avec DLL de tiers et gérer le nom de la DLL
j'ai un projet maven et j'utilise le nativedependencies-maven-plugin
( https://github.com/fmarot/nativedependencies-maven ) pour gérer la DLL.
la DLL est d'un tiers, et a la structure suivante. Disons que le nom du fichier JAR est abc.jar
et la DLL correspondante est abcxyz.dll
, où xyz est le numéro de version sans périodes. Donc si la version est 12.6.1, la DLL est nommée abc1261.dll
. Si le tiers met à jour leur produit à la version 12.7.0, ils émettent un nouveau pot abc.jar
et une nouvelle DLL abc1270.dll
.
je stocke la jarre dans un dépôt local, et le nom de la jarre tel qu'indiqué dans le dépôt est alors abc-x.y.z.jar
. J'ai mis un classificateur sur la DLL appelée natives-abc
, et le nom de la DLL dans le dépôt (une fois déployé) est abc-x.y.z-natives-abc.dll
. Lorsque je construis le projet, abc-x.y.z-natives-abc.dll
est alors copié correctement dans le dossier target/natives
par le nativedependencies-maven-plugin
.
quand je dirige le projet à partir D'Eclipse, il échoue, parce que le bocal cherche abcxyz.dll
et non abc-x.y.z-natives-abc.dll
. Si je copie abc-x.y.z-natives-abc.dll
dans abcxyz.dll
dans le dossier target/natives
, alors tout fonctionne, donc je sais que le java.library.path
est réglé correctement, ce que j'ai également vérifié en inspectant le processus en utilisant l'outil jinfo
.
ce dont j'ai besoin c'est que la DLL soit renommée une fois qu'elle est copiée à partir du dépôt local dans target/natives
. Je ne sais pas comment faire faire ça à maven.
ce que je veux faire, c'est avoir des versions différentes de abc.jar
et abcxyz.dll
dans le dépôt local, et puis changer les étiquettes <version>
dans le fichier pom.xml
pour se référer à différentes versions. Le nom du fichier JAR dans le déploiement n'est pas pertinent, mais C'est le nom DLL associé qui est pertinent parce que le fichier JAR du tiers pour une version spécifique cherche un nom DLL spécifique correspondant à la version.
2 réponses
mainteneur de nativedependencies-maven-plugin here.
Je ne suis pas sûr de comprendre complètement mais je pense que j'ai une solution: si vous deviez déployer/installer dans votre repo (local ou non) le .pot (pas la .dll) fourni par votre tiers, puis quand Maven obtiendra cette dépendance et la décompressera (avec le nativedependency-maven-plugin), il gardera intact le nom de la .dll à l'intérieur. Ainsi, votre code (ou le code de la tierce partie) le trouvera correctement à l'exécution.
si votre propre code charge la DLL, j'aurais suggéré de renommer la DLL en un nom unique sans la version pour simplifier le processus. Espérons que cela aide.
la suggestion ci-dessus a fonctionné. Ce que je devais faire était de créer un zip
contenant abcxyz.dll
, (l'appelant abcxyz.dll.zip
), ajouter cela au dépôt maven en utilisant zip
packaging, et ensuite faire référence à la dépendance dans pom.xml
.
en d'autres termes, Voici la section du pom.xml
qui avait la dépendance:
<dependency>
<groupId>com.thegroup</groupId>
<artifactId>abc</artifactId>
<version>12.6.1</version>
<type>zip</type>
<classifier>natives-abc</classifier>
</dependency>
je viens d'utiliser WinZip pour créer le Zip.
mvn deploy:deploy-file -Durl=file:///path-to-my-repo -Dfile=abc1261.dll.zip -DgroupId=com.thegroup -DartifactId=abc -Dpackaging=zip -Dversion=12.6.1 -Dclassifier=natives-abc