2009-07-02 14 views
4

Ich habe ein Maven-Projekt, und ich möchte eine Verteilung davon mit den Abhängigkeiten erstellen. Ich habe das maven-assembly-plugin ausprobiert und das jar mit Abhängigkeiten aufgebaut, aber das entpackte alle Gläser und verpackte sie alle in ein großes, einzelnes Glas. Was ich möchte, ist etwas wie meine Jar-Datei und ein Lib-Ordner, der alle Abhängigkeiten hat. Dann, wenn ich es ausführe, könnte ich "java -cp lib/* my.package.MainClass" ausführen.Bereitstellen eines Maven-Projekts

Was ist der beste Weg, dies mit Maven zu tun? Oder die empfohlene Vorgehensweise zum Bereitstellen?

Dank,

Jeff

Antwort

7

Ich habe die Maven Montag nur für die in meinem Projekt verwendet.

zuerst Ihr Plugin in Ihrem POM aktivieren und die Assembly Config aufrufen:

 <plugin> 
      <artifactId>maven-assembly-plugin</artifactId> 
      <!--I recommend 2.1 as later versions have a bug that may 
           Duplicate files in your archive 
          --> 
          <version>2.1</version> 
      <!--Executes the packaging along with the mvn package phase 
          --> 
      <executions> 
       <execution> 
        <id>make-assembly</id> 
        <phase>package</phase> 
        <goals> 
         <goal>attached</goal> 
        </goals> 
       </execution> 
      </executions> 
      <configuration> 
       <descriptors> 
        <!--Relative path to your descriptor --> 
        <descriptor>src/main/assembly/package.xml 
         </descriptor> 
       </descriptors> 
      </configuration> 
     </plugin> 

Dann in Ihrem Descriptor können Sie entscheiden, wie Sie Ihr Layout, bevor Sie das Ganze verpacken sein wollen

<assembly> 
    <!-- this will create an extra resource project-1.1.1-package.zip, you can 
     choose jar as well in the format--> 
    <id>package</id> 
    <formats> 
     <format>zip</format> 
    </formats> 
    <includeBaseDirectory>false</includeBaseDirectory> 
    <!-- Insert here extra files as configs or, batch files, resources, docs etc--> 
    <fileSets> 
     <fileSet> 
      <directory>src/main/assembly/files</directory> 
      <outputDirectory>/</outputDirectory> 
      <includes> 
       <include>**/conf/*.*</include> 
       <include>**/doc/*.*</include> 
      </includes> 
     </fileSet> 
      <!-- I like to integrate the jre as well... simplifies my deployement --> 
     <fileSet> 
      <directory>target/jre</directory> 
      <outputDirectory>/jre</outputDirectory> 
     </fileSet> 
    </fileSets> 
    <!-- This will scrub your dependencies and add them to your lib folder, I excluded 
     Test stuff as it is not needed, could have declared the resource as a test 
     only phase as well would not have had to exclude it here 
    --> 
    <dependencySets> 
     <dependencySet> 
      <outputDirectory>lib</outputDirectory>   
      <excludes> 
       <exclude>junit:junit</exclude> 
      </excludes> 
     </dependencySet> 
    </dependencySets> 
</assembly> 

Das erstellt eine Zip-Datei mit dem Layout, das Sie in Ihrer Ausgabe-Verzeichnis-Konfiguration angegeben haben, packen das Ganze als Zip-Datei (Sie können zip, jar, war ... wählen) und stellen es mit dem Rest in meinem Repository bereit.

Ich übersprang Bits und Stücke, um es einfacher zu machen, aber mein Paket erweitert Batch-Dateien, dlls, Config, doc und die JRE, so dass alles in der gleichen zip benötigt wird ... alles ist erforderlich, um das Ding zu laufen ist Extrakt und klicke auf start.bat!

Ich könnte es wahrscheinlich auch in ein Glas richtig formatiert mit METADATA machen und doppelklicken Sie einfach auf das Glas selbst, um alles zu starten, ich brauchte oder habe keine Zeit um diese Option zu spielen, aber Sie können es auch versuchen.

Hüten Sie sich vor Versionen über 2.1 des Assembly-Plugins, es erstellt doppelte Einträge, wenn Ihre Anweisungen es ermöglichen, die gleiche Datei an verschiedenen Orten zu finden, dies wird Ihnen einen lib-Ordner mit den gleichen Gläsern zweimal wiederholen. nicht sehr gefährlich, da das Entpacken sie einbüßt, aber immer noch lästig ist, wenn das Unzip dich fragt, ob du Dateien überschreiben willst. Plus die Tatsache, dass Sie nicht wissen, welche gewonnen haben, wenn sie irgendwie anders herausgekommen sind.

Maven ist großartig, aber ich finde, dass es manchmal frustrierend ist, es zum Laufen zu bringen, Plus-Dokumentation kann manchmal schwer zu finden und zu verwenden sein. Bei entsprechender Verwendung sparen Sie jedoch viel Zeit.

viel glück

+0

genial, danke für die ausführliche Antwort. Ich werde es versuchen. –

+0

geben Sie mir einen Buzz, wenn Sie Probleme mit diesem Ansatz haben .. es kann andere Möglichkeiten, um ähnliche Ergebnisse zu erzielen, aber dieses funktioniert gut für mich. – Newtopian

+0

so weit so gut. Ich habe es versucht, aber ein paar andere schnelle Fragen. meine aktuelle Snapshot-Datei endete auch das Lib-Verzeichnis. Ich hatte gehofft, das außerhalb der lib dir zu haben - ist das möglich? kann ich das auch in Verbindung mit dem maven-jar-plugin verwenden, um eine Manifest-Datei zu generieren und diese zu einem ausführbaren jar zu machen? Oder wäre es besser, wenn ich nur ein Skript erstelle, das die App startet und das einbezieht? danke nochmal! –

1

See:

http://maven.apache.org/shared/maven-archiver/index.html

Sie sollten die maven-jar-Plugin zu verwenden, um ein Archiv zu verpacken, die Hauptklasse angeben entlang auszuführen mit dem Klassenpfad. Es kann eine Manifest-Datei für Sie für Ihr Projekt generieren.

http://maven.apache.org/shared/maven-archiver/examples/classpath.html#Prefix

+0

Jon, danke. Ich konnte das Manifest korrekt generieren, aber gibt es eine Möglichkeit, die Verzeichnisstruktur zu erstellen, die ich brauche? Ich habe zum Beispiel die classpathPrefix lib/erstellt und möchte ein lib-Verzeichnis erstellen, in das die Abhängigkeiten kopiert wurden. –

+0

Der zweite Link hier sagt Ihnen, wie man das macht ...http://maven.apache.org/shared/maven-archiver/examples/claspath.html#Prefix – Jon

Verwandte Themen