# Maven2 - wie mache ich externe Jar Dateien zu Artifacts?



## pocketom (17. Jun 2009)

Ich habe hier eine xyz.jar Datei die nicht im zentralen Maven Repo ist, da sie von einem Drttanbieter kommt habe ich keinen Sourcecode und somit auch kein Projekt dafür. Nun möchte ich auch dieses jar in meinen Projekten als Maven Dependency hinzufügen können. Einen Nexus Repository Server wie im Maven Devinitive Guide beschrieben haben wir aber derzeit nicht in der Firma. Ich habe versucht eine pom.xml für das jar zu schreiben um es zu einem Artifact zu machen, aber ich kann es leider nicht in anderen Maven Projekten importieren. Was muss hierzu noch tun? 

Btw. dies jar File ist ein Wrapper für eine Windows DLL, wie bekomme ich es hin das jar File und DLL File zusammen importiert werden wenn ich einem Project die Dependency hinzufüge?


----------



## maki (17. Jun 2009)

Maven gibt dir doch nach der Fehlermeldung dass das Artefakt nicht gefunden wurde genau die Kommandozeile aus mit der du das Problem löst, musst nur noch den Dateipfad richtig setzen.



> Btw. dies jar File ist ein Wrapper für eine Windows DLL, wie bekomme ich es hin das jar File und DLL File zusammen importiert werden wenn ich einem Project die Dependency hinzufüge?


Hmmm.. dass hört sich schon schwieriger an, sollte aber einfach sein,, würde es mal als eigenes Artifakt mit dem typen DLL probieren.


----------



## pocketom (17. Jun 2009)

Hi! Das ist es ja, Maven gibt mir keinen Fehler. mvn install, mvn site, läuft alles durch ohne Fehler. Ich habe lediglich ein mini Source file welches eigentlich nur einen Import beinhaltet und der wird von Eclipse moniert (the import ... cannot be resolved). Im Buildpath unter Libraries/Maven Dependencies finde ich komischerweise einen Folder und nicht das jar file. Nehme mal an das hier das Problem liegt?


----------



## maki (17. Jun 2009)

Du hast den Wrapper aber schon als Dependency eingetragen?
Oder erwartest du das Maven2 deine Buildpathfehler selber korrigiert?


----------



## pocketom (17. Jun 2009)

Ja, ich habe über "Add Dependency" das Wrapper jar hinzugefügt, es wurde mir direkt über die Liste angeboten als ich unsere firmeneigene GroupID eingetippt habe. Er findet es und es liegt auch im repository Verzeichnis. Am Buildpath habe ich garnichts gemacht, normal sollte Maven die Abhängigkeiten dort doch wie üblich eintragen und einen Verweis auf das lokale repository anlegen, oder irre ich mich?


----------



## maki (17. Jun 2009)

> Am Buildpath habe ich garnichts gemacht, normal sollte Maven die Abhängigkeiten dort doch wie üblich eintragen und einen Verweis auf das lokale repository anlegen, oder irre ich mich?


Wenn du das m2eclipse Plugin nutzt, rechtsklick aufs Projekt, Maven -> update Project Configuration


----------



## pocketom (17. Jun 2009)

<deleted>


----------



## pocketom (17. Jun 2009)

Passiert auch nix, so sieht es im Buildpath aus:




Vielleicht sollte ich dazu sagen das ich zuerst ein Maven Project unter Eclipse erstellt habe. Die jar Datei habe ich benannt wie die ArtifactID und nach /target kopiert. Die DLL befindet sich unter \src\main\resources. Danach habe ich mvn site ausgeführt und jar und pom datei landeten automatisch in meinem lokalen repository. Wenn ich es nun in einem anderen Projekt als dependency hinzufüge dann wird leider der gesamte Projektfolder hinzugefügt anstatt ein jar mit Verweis auf das File wie üblich...?


So sieht die pom.xml aus die ich für das jar file angelegt habe:


```
<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/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.idealsoftware</groupId>
  <artifactId>vpe-javaedition-beta</artifactId>
  <name>VPE Java Edition DLL Wrapper -beta-</name>
  <version>3.2.5.0</version>
  <description>Date: 20090525</description>
  <packaging>jar</packaging>
</project>
```


[EDIT]: Ich habs rausbekommen. Zuerst habe ich das Maven Project gelöscht in Eclipse und nur jar und pom files aufgehoben. Dann habe ich in das jar file reingeschaut und festgestellt das die ursprünglichen Klassen alle nicht mehr drin sind, stattdessen aber meine geliebte DLL Datei die ich ja extra im resource Verzeichnis abgelegt habe. Als ich mvn site ausgeführt habe hat er das jar file neu gebaut, allerdings ohne jeglichen kompilierten Code, denn den habe ich ja nicht... 


Bleibt nur das Problem wie ich jetzt meine DLL Datei automatisch mitimportieren lasse....???


----------



## maki (17. Jun 2009)

> Bleibt nur das Problem wie ich jetzt meine DLL Datei automatisch mitimportieren lasse....???


Als eigene Dependency, aber für deinen Wrapper 
Maven2 kennt nur ein Artifakt pro pom, frustriert viele Menschen vor allem bei der Konvertierung von bestehenden Projekten, das zu umgehen ist zwar möglich, aber der Aufwand ist groß und die Lösung nicht ganz sauber.


----------



## kama (17. Jun 2009)

Hallo,



pocketom hat gesagt.:


> Einen Nexus Repository Server wie im Maven Devinitive Guide beschrieben haben wir aber derzeit nicht in der Firma.


Das muss der erste Schritt sein sonst macht Maven nicht wirklich spass....erst recht im Kommerziellen Umfeld...

Also unbedingt irgendeinen Repository Manager ( Nexus, Archiva, Artifactory etc.) installieren...und den nutzen...



pocketom hat gesagt.:


> Ich habe versucht eine pom.xml für das jar zu schreiben um es zu einem Artifact zu machen, aber ich kann es leider nicht in anderen Maven Projekten importieren. Was muss hierzu noch tun?


Du must das File in Dein lokales Repository importieren....


```
mvn install:install-file -Dfile=xyz.jar -DgroupId=GroupId -DartifactId=ArtifactId -Dversion=1.0.0 -Dpackaging=jar
```
Das installiert das Jar in Dein lokales Repository...(üblicherweise auf Deiner lokalen Platten)...

Das muss dann jeder machen der das Projekt übersetzen will bzw. das Jar (xyz.jar) als Dependency nutzen will...

Wenn Ihr ein internes Repository hättet, könntest Du das dann an einer Zentralen Stelle machen, nämlich dort ...und schon können alle das Nutzen....

Um nun die DLL als weitere Komponente mit abzulegen kannst Du eventuell mit dem Classifier probieren, ob das Klappt...


```
mvn install:install-file  -Dfile=xyz.dll \
                          -DgroupId=GroupId \
                          -DartifactId=ArtifactId \
                          -Dversion=1.0.0 \
                          -Dpackaging=dll \
                          -Dclassifier=dll
```

Das bedeutet aber auch, dass Du eine weitere Dependency mit entsprechendem Classifier und packaging angeben musst...eventuelle kannst Du packaging weg lassen bin ich mir aber gerade nicht sicher....

MfG
Karl Heinz Marbaise


----------



## kama (17. Jun 2009)

Hallo,


maki hat gesagt.:


> Maven2 kennt nur ein Artifakt pro pom, ..


Stimmt nicht ganz...man kann mithilfe von Classifier durchaus mehrere Artefakte adressieren.....(Im Sinne von Jar's hast Du recht ;-).

MfG
Karl Heinz Marbaise


----------



## maki (17. Jun 2009)

kama hat gesagt.:


> Hallo,
> 
> Stimmt nicht ganz...man kann mithilfe von Classifier durchaus mehrere Artefakte adressieren.....(Im Sinne von Jar's hast Du recht ;-).


Hi,

hast vergessen zu zitieren:


> das zu umgehen ist zwar möglich, aber der Aufwand ist groß und die Lösung nicht ganz sauber.




Klar könnte man seine eigenen, zusätzlichen Artefakte bauen und mit classifiern versehen und beim install und deploy ins zugehörige Repo schieben wie das für die JavaDoc, Test Klassen etc. gemacht wird, ist aber Aufwand und widerspricht dem "Maven way of doing things".


----------



## pocketom (18. Jun 2009)

Vielen Dank für Eure Antworten! Ich mache mich dann mal noch diese Woche daran einen Repository Server aufzusetzen. Ist irgendeines der angebotenen (Open-Source)Produkte hier besonders empfehlenswert?


----------



## maki (18. Jun 2009)

Ich steh auf artifactory, einfach & für den Enterprise Bereich geegnet.


----------



## kama (18. Jun 2009)

Hi,



			
				maki hat gesagt.:
			
		

> ...das zu umgehen ist zwar möglich, aber der Aufwand ist groß und die Lösung nicht ganz sauber.


Na ja "groß" ? ....

Einfach z.B. das Maven-jar-plugin in einen anderen Execution packen und noch einen Classifier definieren...fertig...ca. 10-15 Zeilen...(schön formatiert)....Nenne ich nicht wirklich viel Aufwand....
Offiziell dokumentiert...
Oder eben per assembly Plugin ...

MfG
Karl Heinz Marbaise


----------



## maki (18. Jun 2009)

Schon klar dass es für jars relativ einfach geht, aber nicht alle Artifakte sind jars 

Was ist mit XML bzw. anderen Dateien?
"Legacy" Projekte die zB. mit Ant erstellt werden haben oft eine vielzahl von Artifakten die keine Jars sind (zB. EJb Projekte die gleich die Konfig für den Appp Server miterstellen), da hilft das jar Plugin wenig.


----------

