Maven: La confezione per questo progetto non ha assegnato un file all'artefatto di build


113

Sto usando Maven 3.0.3 su Mac 10.6.6. Ho un progetto JAR e quando eseguo il comando "mvn clean install: install", ricevo l'errore,

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-install-plugin:2.3.1:install (default-cli) on project StarTeamCollisionUtil: The packaging for this project did not assign a file to the build artifact -> [Help 1]

Cosa significa e come posso risolverlo? Di seguito è riportato il mio pom.xml. Fammi sapere quali altre informazioni sarebbero utili e modificherò questo post. Grazie, - Dave

<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.myco.starteam.util</groupId>
<artifactId>StarTeamCollisionUtil</artifactId>
<packaging>jar</packaging>
<name>StarTeam Collision Util</name>
<description>
    The StarTeam Collision Utility provides developers and release engineers alike the ability to
    compare files attached to a set of CRs to see if conflicts exist in the change set.
</description>
<version>1.0-SNAPSHOT</version>
<url>http://cm-build.myco.com:8080/hudson/view/Tools/job/StarTeamCollisionUtil - TRUNK/</url>
<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<repositories>
    <repository>
        <id>myco-sonatype-nexus-snapshots</id>
        <name>MyCo Sonatype-Nexus Snapshots</name>
        <url>http://sonatype.myco.com/nexus/content/repositories/snapshots/</url>
    </repository>
</repositories>
<dependencies>
    <dependency>
        <groupId>starteam</groupId>
        <artifactId>starteam</artifactId>
        <version>1.1.0</version>
        <type>jar</type>
        <scope>system</scope>
        <systemPath>${basedir}/lib/starteam110.jar</systemPath>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.8.2</version>
    </dependency>
    <dependency>
        <groupId>org.apache.ant</groupId>
        <artifactId>ant</artifactId>
        <version>1.8.1</version>
    </dependency>
    <dependency>
        <groupId>javax.mail</groupId>
        <artifactId>mail</artifactId>
        <version>1.4.1</version>
        <type>jar</type>
        <scope>compile</scope>
    </dependency>
</dependencies>
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.8.1</version>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-site-plugin</artifactId>
            <version>3.0-beta-3</version>
            <configuration>
                <reportPlugins>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-surefire-report-plugin</artifactId>
                        <version>2.5</version>
                    </plugin>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-javadoc-plugin</artifactId>
                        <version>2.7</version>
                        <configuration>
                            <linksource>true</linksource>
                        </configuration>
                    </plugin>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-jxr-plugin</artifactId>
                        <version>2.2</version>
                    </plugin>
                    <plugin>
                        <groupId>org.codehaus.mojo</groupId>
                        <artifactId>versions-maven-plugin</artifactId>
                        <version>1.2</version>
                    </plugin>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-project-info-reports-plugin</artifactId>
                        <version>2.3.1</version>
                        <reportSets>
                            <reportSet>
                                <reports>
                                    <report>index</report>
                                    <report>dependencies</report>
                                    <report>dependency-management</report>
                                    <report>cim</report>
                                    <report>issue-tracking</report>
                                    <report>license</report>
                                    <report>scm</report>
                                </reports>
                            </reportSet>
                        </reportSets>
                    </plugin>
                </reportPlugins>
            </configuration>
        </plugin>
    </plugins>
</build>
<distributionManagement>
    <repository>
        <id>sonatype-nexus</id>
        <url>http://sonatype.myco.com/nexus/content/repositories/snapshots/</url>
    </repository>
</distributionManagement>
<scm>
    <url>https://starteam.cmass.myco.com/BorlandStarTeam/BorlandStarTeam.jsp</url>
</scm>
<issueManagement>
    <system>StarTeam</system>
    <url>https://starteam.cmass.myco.com/BorlandStarTeam/BorlandStarTeam.jsp</url>
</issueManagement>
<ciManagement>
    <system>Hudson</system>
    <url>http://cm-build.myco.com:8080/hudson/</url>
</ciManagement>
</project>

Risposte:


168

Non so se questa sia la risposta oppure no ma potrebbe portarti nella giusta direzione ...

Il comando install:installè in realtà un obiettivo su maven-install-plugin . Questo è diverso dalla installfase del ciclo di vita di Maven.

Le fasi del ciclo di vita di Maven sono passaggi di una build a cui alcuni plugin possono legarsi. Quando si richiama una singola fase del ciclo di vita, possono essere eseguiti molti obiettivi diversi da plug-in diversi.

Ciò a cui questo si riduce è il comando ...

mvn clean install

è diverso da...

mvn clean install:install

Il primo eseguirà tutti gli obiettivi in ​​ogni ciclo che precede l'installazione e inclusa (come compilazione, pacchetto, test, ecc.). Quest'ultimo non compilerà o impacchetterà nemmeno il tuo codice, eseguirà solo quell'obiettivo. Questo ha senso, guardando l'eccezione; si parla di:

StarTeamCollisionUtil: il pacchetto per questo progetto non ha assegnato un file all'artefatto di build

Prova il primo e il tuo errore potrebbe scomparire!


Sto correndo attraverso Bamboo, ma non vedo nulla di mvn install: installa da nessuna parte in config
Pra_A

96

TL; DR Per risolvere questo problema, richiamare prima il plug-in per la creazione di pacchetti, ad esempio per l' jarutilizzo di pacchetti maven-jar-plugin, come segue:

mvn jar:jar install:install

O

mvn jar:jar deploy:deploy 

Se hai effettivamente bisogno di distribuire.

Gotcha Questo approccio non funzionerà se hai un progetto multi-modulo con pacchetti diversi (ear / war / jar / zip) - anche peggio, verranno installati / distribuiti artefatti sbagliati! In tal caso, utilizzare le opzioni del reattore per creare solo il modulo dispiegabile (ad esempio il war).


Spiegazione

In alcuni casi in realtà vuoi eseguire direttamente un obiettivo install:installo deploy:deploy(cioè dal maven-deploy-plugin, l' deployobiettivo, non la deploy fase Maven ) e finiresti nella fastidiosa The packaging for this project did not assign a file to the build artifact.

Un classico esempio è un lavoro CI (un lavoro Jenkins o Bamboo, ad esempio) in cui in diversi passaggi si desidera eseguire / preoccuparsi di diversi aspetti:

  • Un primo passo sarebbe l' mvn clean installesecuzione di test e la copertura dei test
  • Un secondo passo sarebbe un'analisi Sonarqube basata su un profilo di qualità, ad esempio mvn sonar:sonarpiù ulteriori opzioni
  • Quindi, e solo dopo aver eseguito correttamente i test e superato il controllo di qualità, si desidera distribuire al repository aziendale Maven gli artefatti del progetto finale, ma non si desidera rieseguire mvn deploy, perché eseguirà nuovamente le fasi precedenti (e compilerà, testerà , ecc.) e vuoi che la tua build sia efficace ma allo stesso tempo veloce .

Sì, potresti velocizzare quest'ultimo passaggio saltando almeno i test (compilazione ed esecuzione, tramite -Dmaven.test.skip=true) o giocare con un profilo particolare (per saltare il maggior numero possibile di plugin), ma è molto più semplice e chiaro eseguirlo semplicemente mvn deploy:deploy.

Ma fallirebbe con l'errore sopra, perché come specificato anche dalle FAQ del plugin :

Durante la fase di confezionamento tutto raccolto e contestualizzato. Con questo meccanismo Maven può garantire che maven-install-plugine maven-deploy-pluginstiano copiando / caricando lo stesso set di file. Quindi, quando esegui solo l'esecuzione deploy:deploy, non ci sono file inseriti nel contesto e non c'è niente da distribuire.

In effetti, deploy:deploynecessita di alcune informazioni di runtime inserite nel contesto di compilazione dalle fasi precedenti (o da precedenti esecuzioni di plugin / obiettivi).

È stato anche segnalato come un potenziale bug:: MDEPLOY-158deploy: deploy non funziona solo per la distribuzione di artefatti nel repository remoto Maven

Ma poi rifiutato come non un problema.

L' deployAtEndopzione di configurazione di maven-deploy-pluginnon aiuta nemmeno in determinati scenari perché abbiamo passaggi di lavoro intermedi da eseguire:

Indica se ogni progetto deve essere distribuito durante la propria fase di distribuzione o alla fine della compilazione del multimodulo. Se impostato su truee la compilazione non riesce, nessuno dei progetti del reattore viene distribuito. (sperimentale)

Quindi, come risolverlo?
Esegui semplicemente quanto segue in un terzo / ultimo passaggio simile:

mvn jar:jar deploy:deploy

Il maven-jar-pluginnon ricreerà alcun jar come parte della tua build, grazie alla sua forceCreationopzione impostata per falseimpostazione predefinita:

Richiedi il plugin jar per creare un nuovo JAR anche se nessuno dei contenuti sembra essere cambiato. Per impostazione predefinita, questo plugin controlla se il jar di output esiste e gli input non sono cambiati. Se queste condizioni sono vere, il plugin salta la creazione del vaso.

Ma popolerà piacevolmente il contesto di build per noi e renderà deploy:deployfelici. Nessun test da saltare, nessun profilo da aggiungere. Proprio quello che ti serve: velocità.


Nota aggiuntiva: se stai utilizzando il build-helper-maven-plugin, buildnumber-maven-plugino qualsiasi altro plugin simile per generare metadati successivamente utilizzati da maven-jar-plugin(es. Voci per il file Manifest), molto probabilmente hai esecuzioni collegate alla validatefase e vuoi comunque averle durante il jar:jarpassaggio di costruzione (e tuttavia mantenere un'esecuzione veloce). In questo caso l'overhead quasi innocuo è richiamare la validate fase come segue:

mvn validate jar:jar deploy:deploy

Ancora un'altra nota aggiuntiva: se non hai jar, diciamo, warpacchettizzazione, usala war:warprima dell'installazione / distribuzione.

Gotcha come indicato sopra, controlla il comportamento nei progetti multi modulo.


8
Mi sono imbattuto in questo scenario esatto. Scrittura fantastica - dovrebbe essere nelle FAQ del plugin di distribuzione invece della spiegazione abbastanza concisa "non puoi farlo".
markdsievers

Chi avrebbe mai pensato che il barattolo può essere utile dopotutto;)
wearego

Vedi la mia soluzione per progetti multi-modulo: stackoverflow.com/a/57824874/318174
Adam Gent

questa soluzione funziona bene per il mio progetto multi-modulo @AdamGent
karakays

Ottima spiegazione. Descritto esattamente il mio scenario con il mio server Jenkins.
wimnat

14

Questa risposta è su una domanda molto vecchia per aiutare gli altri ad affrontare questo problema.

Affronto questo errore fallito mentre stavo lavorando al mio Javaprogetto utilizzando IntelliJ IDEAIDE.

Failed to execute goal org.apache.maven.plugins:maven-install-plugin:2.4:install (default-cli) on project getpassword: The packaging for this project did not assign a file to the build artifact

questo fallito accade, quando scelgo install:installsotto Plugins - install, come indicato con la freccia rossa nell'immagine sotto.

Scegli la selezione sbagliata

Una volta eseguito il selezionato installsotto Lifecyclecome illustrato sopra, il problema è scomparso e il mio esperto installa compilazione build con successo.


6

Ho lo stesso problema. Il messaggio di errore per me non è completo. Ma nel mio caso, ho aggiunto il vaso di generazione con le fonti. Inserendo questo codice in pom.xml:

<build> 
    <pluginManagement>
        <plugins>
            <plugin>
                <artifactId>maven-source-plugin</artifactId>
                <version>2.1.2</version>
                <executions>
                    <execution>
                        <phase>deploy</phase>
                        <goals>
                            <goal>jar</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </pluginManagement>
</build>

Quindi nella fase di deploy eseguo source: jar goal che produce jar con le sorgenti. E il deploy termina con BUILD SUCCESS


2

devi cancellare il file di destinazione come in jar e altri In C: guida la tua cartella su .m2 vedi la posizione in cui installa ed elimina il file .jar, il file Snaphot ed elimina i file di destinazione quindi pulisci l'applicazione che hai trovato verrà eseguita


Bene una soluzione parziale.
Jasper Lankhorst

2

Questo errore si verifica quando si utilizza la versione 3.0.0-M1 di maven-install-plugin (o simile)

Come già accennato in precedenza e anche qui funziona la seguente versione plug-in:

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-install-plugin</artifactId>
        <version>2.5.2</version>
    </plugin>

1

Mentre la risposta di @ A_Di-Matteo funziona per il non multimodulo, ho una soluzione per i multimoduli.

La soluzione è sovrascrivere ogni configurazione del plugin in modo che si leghi alla fase di nonecon l'eccezione del plugin jar / war / ear e, ovviamente, del plugin deploy. Anche se hai un solo modulo, i miei test rudimentali mostrano che questo è un po 'più veloce (per ragioni che non so) in termini di prestazioni.

Quindi il trucco è creare un profilo che faccia quanto sopra che viene attivato quando si desidera solo distribuire.

Di seguito è riportato un esempio di uno dei miei progetti che utilizza il plug-in delle ombre e quindi ho dovuto sovrascrivere il plug-in jar per non sovrascriverlo:

    <profile>
      <id>deploy</id>
      <activation>
        <property>
          <name>buildStep</name>
          <value>deploy</value>
        </property>
      </activation>
      <build>
        <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <executions>
              <execution>
                <id>default-compile</id>
                <phase>none</phase>
              </execution>
              <execution>
                <id>default-testCompile</id>
                <phase>none</phase>
              </execution>
              <execution>
                <id>test-compile</id>
                <phase>none</phase>
              </execution>
            </executions>
          </plugin>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <executions>
              <execution>
                <id>default-test</id>
                <phase>none</phase>
              </execution>
            </executions>
          </plugin>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-install-plugin</artifactId>
            <executions>
              <execution>
                <id>default-install</id>
                <phase>none</phase>
              </execution>
            </executions>
          </plugin>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-resources-plugin</artifactId>
            <executions>
              <execution>
                <id>default-resources</id>
                <phase>none</phase>
              </execution>
              <execution>
                <id>default-testResources</id>
                <phase>none</phase>
              </execution>
            </executions>
          </plugin>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <executions>
              <execution>
                <id>default</id>
                <phase>none</phase>
              </execution>
            </executions>
          </plugin>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <executions>
              <execution>
                <id>default-jar</id>
                <configuration>
                  <forceCreation>false</forceCreation>
                </configuration>
              </execution>
            </executions>
          </plugin>
        </plugins>
      </build>
    </profile>

Ora, se lo eseguo mvn deploy -Pdeploy, eseguirà solo il jar e distribuirà i plugin.

Il modo in cui puoi capire quali plugin devi sovrascrivere è eseguire deploy e guardare il log per vedere quali plugin sono in esecuzione. Assicurati di tenere traccia della idconfigurazione del plugin che è parentesi dopo il nome del plugin.


0

Ho avuto lo stesso problema, ma inizialmente ho eseguito mvn install (non install: installa come menzionato in precedenza).

La soluzione è includere:

 <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-install-plugin</artifactId>
        <version>2.5.2</version>
 </plugin>

Nella sezione di gestione dei plugin.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.