wake-up-neo.com

Maven - Abhängig vom zusammengebauten Reißverschluss

Ich versuche, Project B eine Zip-Datei, die von Project A erstellt und in einem Remote-Repository bereitgestellt wurde, herunterzuziehen (und zu entpacken).

Die Postleitzahl wird mit dem maven-Assembly-plugin Mit dem Verpackungstyp pom erstellt und angehängt:

<artifactId>project-a</artifactId>
<name>Zip</name>
<description>Used by Project B</description>
<packaging>pom</packaging>

...

<plugin>
  <groupId>org.Apache.maven.plugins</groupId>
  <artifactId>maven-Assembly-plugin</artifactId>
  <executions>
    <execution>
      <id>distribution-package</id>
      <phase>package</phase>
      <goals>
        <goal>single</goal>
      </goals>
      <configuration>
        <descriptors>
          <descriptor>src/main/Assembly/scripts.xml</descriptor>
        </descriptors>
        <tarLongFileMode>gnu</tarLongFileMode>
      </configuration>
    </execution>
  </executions>
</plugin>

Versuch, es mit dem maven-dependency-plugin Von Project B herunterzuziehen:

<plugin>
  <groupId>org.Apache.maven.plugins</groupId>
  <artifactId>maven-dependency-plugin</artifactId>
  <executions>
    <execution>
      <id>copy-scripts</id>
      <phase>package</phase>
      <goals>
        <goal>copy</goal>
      </goals>
      <configuration>
        <outputDirectory>${basedir}/target/staging</outputDirectory>
        <stripVersion>true</stripVersion>
        <artifactItems>
          <artifactItem>
            <groupId>...</groupId>
            <artifactId>...</artifactId>
            <version>...</version>
            <overWrite>true</overWrite>
            <type>Zip</type>
          </artifactItem>
        </artifactItems>
      </configuration>
    </execution>
  </executions>
</plugin>

schlägt fehl mit: [ERROR] Failed to execute goal on project ...: Could not resolve dependencies for project group:artifact:pom:version: Could not find artifact group:project-a:Zip:version in nexus (http://...:8081/nexus/content/groups/public) -> [Help 1]

Ich würde annehmen, dass dies daran liegt, dass ich Project A 's Verpackung als pom und nicht Zip angegeben habe, aber ich kann nicht Project A angeben als Verpackungsart Zip, weil es ergibt:

[ERROR]     Unknown packaging: Zip @ line 13, column 13

Mache ich hier etwas falsch oder geht das einfach nicht? Ich habe nur eine Reihe von Dateien, die ich zu einem Artefakt bündeln möchte, und erlaube mehreren anderen Projekten, diese herunterzuladen und zur Verwendung zu entpacken. Offen für verschiedene Vorschläge ...

Ich habe auch geprüft, ob die zusammengebaute Zip tatsächlich im Nexus ist.

AKTUALISIERT MIT ANTWORT

Zum Vorteil aller anderen fehlte mir, dass der <classifier> Der Abhängigkeit mit dem <id> Der Assembly übereinstimmen muss. Beachten Sie, dass in den folgenden Dateien thisistheattachedartifactsclassifier angegeben ist.

scripts.xml (Projekt A):

<Assembly>
  <id>thisistheattachedartifactsclassifier</id>
  <formats>
    <format>Zip</format>
  </formats>

  <fileSets>
    <fileSet>
      <directory>src/main/resources</directory>
      ...
    </fileSet>
  </fileSets>
</Assembly>

pom.xml (Projekt B):

<plugin>
  <groupId>org.Apache.maven.plugins</groupId>
  <artifactId>maven-dependency-plugin</artifactId>
  <executions>
    <execution>
      <id>copy-scripts</id>
      <phase>package</phase>
      <goals>
        <goal>copy</goal>
      </goals>
      <configuration>
        <outputDirectory>${basedir}/target/staging</outputDirectory>
        <stripVersion>true</stripVersion>
        <artifactItems>
          <artifactItem>
            <groupId>...</groupId>
            <artifactId>...</artifactId>
            <version>...</version>
            <classifier>thisistheattachedartifactsclassifier</classifier>
            <overWrite>true</overWrite>
            <type>Zip</type>
          </artifactItem>
        </artifactItems>
      </configuration>
    </execution>
  </executions>
</plugin>
42
integsrtite

Willkommen bei Stack Overflow :).

Sie sind auf dem richtigen Weg. Ihr echtes Problem ist die Verwendung einer Zip.

Die folgende Konfiguration ist in Ordnung und funktioniert hervorragend für mich. Es ist eine alte (vor 2 Jahren), und ich bin nicht sicher, ob sie den Best Practices entspricht. Aber ich weiß, dass das funktioniert.

Auf diese Weise kann ich einige Ressourcen auf Projekte verteilen, insbesondere für Komponententests.

Zip-Projekt:

pom.xml

<groupId>com.mycompany</groupId>
<artifactId>cfg_dev</artifactId>
<version>1.1.0</version>

<build>
    <plugins>
        <plugin>
            <groupId>org.Apache.maven.plugins</groupId>
            <artifactId>maven-Assembly-plugin</artifactId>
            <executions>
                <execution>
                    <id>cfg-main-resources</id>
                    <goals>
                        <goal>single</goal>
                    </goals>
                    <phase>package</phase>
                    <configuration>
                        <descriptors>
                            <descriptor>/src/main/Assembly/resources.xml</descriptor>
                        </descriptors>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

Assembly-Deskriptor: Dieses Artefakt wird erzeugt: cfg_dev-1.1.0-resources.Zip Bitte beachten Sie, dass

  1. dies ist ein Zip-Archiv
  2. der "Klassifizierer" ist Ressourcen (wie Assembly Name)

    resources Zip false src/main/resources

Hauptprojekt:

pom.xml

Bitte beachte, dass

  1. dies hängt von einem Zip-Archiv ab
  2. die Abhängigkeit "Klassifikator" ist Ressourcen (wie zuvor Assembly Name)

    <!-- Unit test dependency -->
    <dependency>
        <groupId>com.mycompany</groupId>
        <artifactId>cfg_dev</artifactId>
        <version>${project.version}</version>
        <classifier>resources</classifier>
        <type>Zip</type>
        <scope>test</scope>
    </dependency>
    
      ....
    
    <build>
      <testResources>
        <!-- Ressources habituelles  -->
        <testResource>
            <directory>src/test/resources</directory>
            <filtering>true</filtering>
        </testResource>
        <!-- Unzipped resources from cfg_dev  -->
        <testResource>
            <directory>${project.build.directory}/test-resources</directory>
            <filtering>true</filtering>
        </testResource>
    </testResources>
    
    <plugins>
    
        <!-- Unzip shared resources -->
            <groupId>org.Apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <executions>
                <execution>
                    <id>unpack-cfg-test-resources</id>
                    <goals>
                        <goal>unpack-dependencies</goal>
                    </goals>
                    <phase>generate-test-resources</phase>
                    <configuration>
                        <outputDirectory>${project.build.directory}/test-resources</outputDirectory>
                        <includeArtifactIds>cfg_dev</includeArtifactIds>
                        <includeGroupIds>${project.groupId}</includeGroupIds>
                        <excludeTransitive>true</excludeTransitive>
                        <excludeTypes>pom</excludeTypes>
                        <scope>test</scope>
                    </configuration>
                </execution>
            </executions>
        </plugin>
      </plugins>
    

Ich hoffe das ist klar und das wird dir helfen :)

33
Jean-Rémy Revy

Ein alternativer Ansatz könnte darin bestehen, das Zippen ganz aufzugeben, den Maven-Standardlebenszyklus zu verwenden, um Ihre Dateien als Ressourcen in eine JAR-Datei zu packen und von Ihren anderen Projekten aus über den Klassenpfad darauf zuzugreifen.

Sofern Sie keine speziellen Anforderungen an das Packen (einschließlich, ausschließlich usw.) haben, ist hierfür keine zusätzliche Konfiguration erforderlich. Legen Sie Ihre Daten einfach im Verzeichnis src/main/resources Ihres Projekts ab.

Dieser Ansatz hat den zusätzlichen Vorteil, dass er beim Aufrufen aus einem IDE wie Eclipse heraus unverändert funktioniert.

4
Nicola Musatti

Wenn Sie jemals so etwas über die Befehlszeile ausführen möchten (z. B. über ein Skript, ohne eine pom.xml - Datei schreiben zu müssen), gehen Sie wie folgt vor ...

Sie können entweder die einzelnen Eigenschaften angeben:

mvn dependency:copy -DgroupId=org.Apache.maven -DartifactId=maven-core -Dversion=2.2.1 -Dpackaging=Zip -Dclassifier=thisistheattachedartifactsclassifier

Oder geben Sie sie alle in einem artifact Parameter an:

mvn dependency:copy -Dartifact=org.Apache.maven:maven-core:2.2.1:Zip:thisistheattachedartifactsclassifier

Bei letzterem ist es wichtig, das classifier am Ende nach dem Attribut packaging/type Zu belassen. Wie folgt: -Dartifact=groupId:artifactId:version:type:classifier

Optional können Sie das Zielverzeichnis auch mit dem Parameter -DoutputDirectory=<directory> Angeben.

0
nwinkler