2012-05-09 4 views
10

Hier ist das Szenario:Maven SCHNAPPSCHUSS jar Dateinamen nicht konsistent in MANIFEST Datei Maven Assembly mit

Zwei Maven 3 Projekt baut.

Build 1 verfügt über Snapshot-Jars, die für Nexus bereitgestellt werden.

Build-2 hat Abhängigkeiten von den Snapshots, verwiesen wie 1.0.0-SNAPSHOT, die nach oben und gezippt mit dem mvn clean package assembly:single Befehl verpackt werden.

Das Problem, das wir laufen in: Gelegentlich, wenn die Baugruppe erstellt wird, wird die Datei MANIFEST für das Glas sagen manchmal some.jar.1.0.0-snapshot und manchmal wird es some.jar sagen. 1.0.0-Datum-Zeit-Stempel, wodurch Klassen nicht definierte Fehler verursacht.

Gibt es eine Möglichkeit, dieses Benennungsproblem in der Manifestdatei zu verhindern?

--edit--

Weitere Forschung folgend entdeckt:

„Wenn die Momentaufnahme aus einem Repo aufgelöst wurde, dann wird es timestamped werden, wenn es darum geht, aus dem Reaktor oder lokalen Repo, dann wird es -snapshot sein. das Plugin ruft in die maven Auflösungslogik so ist dieser Kern maven Verhalten. "

Dies ist das genaue i ssue, in das hineingelaufen wird. Die zweite Build-Manifestdatei hat immer einen Eintrag von ./lib/Framework-1.0.0-SNAPSHOT.jar, wobei sich der tatsächliche JAR-Dateiname zwischen ./lib/Framework-1.0.0-SNAPSHOT.jar und ./lib/Framework-1.0.0-timestamp.jar basierend auf dem obigen Zitat.

+0

[This] (http://stackoverflow.com/questions/2516860/maven-how-to-create-assembly-with-snapshot-artifacts-without-timestamps-file-na) könnte helfen, es beschreibt die Einstellung von outputfilenamemapping Dateinamen in Snapshots konsistent zu machen. – prunge

+1

Wie wird das Manifest des SNAPSHOT generiert und wie wird es konfiguriert, um diese Informationen zu erzeugen? Außerdem ist mvn clean package assembly: single called und nicht einfach mvn clean package cause wird das konfigurierte assembly-plugin aufrufen. – khmarbaise

+0

Es gibt kein Manifest für den SNAPSHOT selbst. Das Manifest mit dem Problem ist im 2. Build. Und mit etwas Hilfe von einem Kollegen fanden wir diese 'Wenn der Snapshot von einem Repo gelöst wurde, dann wird es Zeitstempel sein, wenn es aus dem Reaktor oder lokalen Repo kam, dann wird es -SNAPSHOT. Das Plugin ruft die Maven-Auflösungslogik auf, so dass dies das Core-Maven-Verhalten ist. Dies ist das genaue Problem, das ich habe, ich muss mich nur darum kümmern. Warum Paket Assembly: Single aufgerufen wird, gut, weil wir neu zu Maven als Ganzes sind. – Thaldin

Antwort

6

In <dependencySet> müssen Sie <outputFileNameMapping>${artifact.artifactId}-${artifact.baseVersion}.${artifact.extension}</outputFileNameMapping>

zum Beispiel setzen:

<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd"> 
    <id>appserverB</id> 
    <formats> 
    <format>zip</format> 
    </formats> 
    <dependencySets> 
    <dependencySet> 
     <outputDirectory>/lib</outputDirectory> 
     <outputFileNameMapping>${artifact.artifactId}-${artifact.baseVersion}.${artifact.extension}</outputFileNameMapping> 
     <includes> 
     <include>application:logging</include> 
     <include>application:core</include> 
     <include>application:utils</include> 
     <include>application:appserverB</include> 
     </includes> 
    </dependencySet> 
    </dependencySets> 
</assembly> 

Wenn Sie eine der Verwendung sind eingebaut in Montage Deskriptoren müssen Sie es für sich selbst replizieren und fügen im outputFileNameMapping Eintrag selbst

0

Verwenden Sie <useBaseVersion>false</useBaseVersion>, wenn Sie Abhängigkeiten kopieren müssen. Zum Beispiel:

   <plugin> 
        <groupId>org.apache.maven.plugins</groupId> 
        <artifactId>maven-dependency-plugin</artifactId> 
        <version>2.8</version> 
        <executions> 
         <execution> 
          <id>copy</id> 
          <phase>package</phase> 
          <goals> 
           <goal>copy-dependencies</goal> 
          </goals> 
          <configuration> 
           <outputDirectory>${project.build.directory}</outputDirectory> 
           <useBaseVersion>false</useBaseVersion> 
          </configuration> 
         </execution> 
        </executions> 
       </plugin> 
0

Für diejenigen, die in diesen Laufe und die Antwort von Stephen Connolly sehen aber immer noch Ausnahmen am Ende mit, könnte dies auf die Tatsache zurückzuführen sein, dass einige Abhängigkeiten Klassifizierer in ihrem Namen. Dann werden Sie haben das Muster passen die dashClassifier als optionaler Wert zu verwenden:

<outputFileNameMapping>${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}</outputFileNameMapping> 

Dies funktioniert sogar, wenn die dependecy verwendet kein Klassifizierer haben.

Siehe die documentation for the assembly plugin für weitere Details.