Maven: Paket untuk proyek ini tidak menetapkan file ke artefak build

113

Saya menggunakan Maven 3.0.3 di Mac 10.6.6. Saya memiliki proyek JAR dan ketika saya menjalankan perintah "mvn clean install: install", saya mendapatkan kesalahan,

[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]

Apa artinya ini dan bagaimana cara memperbaikinya? Di bawah ini adalah pom.xml saya. Beri tahu saya info lain apa yang bisa membantu dan saya akan mengedit posting ini. Terima kasih, - 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>
Dave
sumber

Jawaban:

168

Saya tidak tahu apakah ini jawabannya atau tidak, tetapi ini mungkin membawa Anda ke arah yang benar ...

Perintah install:installini sebenarnya adalah tujuan dari maven-install-plugin . Ini berbeda dengan installfase siklus hidup maven.

Fase siklus hidup Maven adalah langkah-langkah dalam build yang dapat diikat oleh plugin tertentu. Banyak tujuan berbeda dari plugin yang berbeda dapat dijalankan saat Anda menjalankan fase siklus hidup tunggal.

Apa intinya adalah perintah ...

mvn clean install

berbeda dengan...

mvn clean install:install

Yang pertama akan menjalankan semua tujuan dalam setiap siklus yang mengarah ke dan termasuk penginstalan (seperti kompilasi, paket, pengujian, dll.). Yang terakhir bahkan tidak akan mengkompilasi atau mengemas kode Anda, itu hanya akan menjalankan satu tujuan itu. Ini agak masuk akal, melihat pengecualian; itu berbicara tentang:

StarTeamCollisionUtil: Kemasan untuk proyek ini tidak menetapkan file ke artefak build

Coba yang pertama dan kesalahan Anda mungkin hilang begitu saja!

Jesse Webb
sumber
Saya menjalankan melalui Bamboo, tetapi saya tidak melihat apa pun mvn install: instal di mana saja di konfigurasi
Pra_A
96

TL; DR Untuk memperbaiki masalah ini, aktifkan plugin pengemasan sebelumnya, misalnya untuk jarpenggunaan pengemasan maven-jar-plugin, sebagai berikut:

mvn jar:jar install:install

Atau

mvn jar:jar deploy:deploy 

Jika Anda benar-benar perlu menerapkan.

Gotcha Pendekatan ini tidak akan berfungsi jika Anda memiliki proyek multi-modul dengan paket yang berbeda (ear / war / jar / zip) - lebih buruk lagi, artefak yang salah akan dipasang / disebarkan! Dalam kasus seperti itu, gunakan opsi reactor untuk hanya membangun modul yang dapat diterapkan (misalnya war).


Penjelasan

Dalam beberapa kasus Anda benar-benar ingin menjalankan secara langsung install:installatau deploy:deploytujuan (yaitu, dari maven-deploy-plugin, deploytujuan, bukan deploy fase Maven ) dan Anda akan berakhir dengan mengganggu The packaging for this project did not assign a file to the build artifact.

Contoh klasik adalah pekerjaan CI (pekerjaan Jenkins atau Bamboo, misalnya) di mana dalam langkah yang berbeda Anda ingin menjalankan / memperhatikan aspek yang berbeda:

  • Langkah pertama adalah mvn clean install, melakukan tes dan cakupan tes
  • Langkah kedua adalah analisis Sonarqube berdasarkan profil kualitas, misalnya mvn sonar:sonarditambah opsi lebih lanjut
  • Kemudian, dan hanya setelah eksekusi uji yang berhasil dan gerbang kualitas berlalu, Anda ingin menerapkan artefak proyek akhir ke repositori perusahaan Maven Anda, namun Anda tidak ingin menjalankan ulang mvn deploy, karena itu akan kembali mengeksekusi fase sebelumnya (dan mengompilasi, menguji , dll.) dan Anda ingin bangunan Anda efektif tetapi juga cepat .

Ya, Anda dapat mempercepat langkah terakhir ini setidaknya melewatkan tes (kompilasi dan eksekusi, melalui -Dmaven.test.skip=true) atau bermain dengan profil tertentu (untuk melewati plugin sebanyak mungkin), tetapi jauh lebih mudah dan jelas untuk menjalankannya saja mvn deploy:deploy.

Tetapi itu akan gagal dengan kesalahan di atas, karena seperti yang ditentukan oleh FAQ plugin :

Selama fase pengemasan semua dikumpulkan dan ditempatkan dalam konteks. Dengan mekanisme ini Maven dapat memastikan bahwa maven-install-plugindan maven-deploy-pluginsedang menyalin / mengupload kumpulan file yang sama. Jadi, ketika Anda hanya mengeksekusi deploy:deploy, maka tidak ada file yang dimasukkan ke dalam konteks dan tidak ada yang perlu diterapkan.

Memang, deploy:deploymembutuhkan beberapa informasi runtime yang ditempatkan dalam konteks build oleh fase sebelumnya (atau eksekusi plugin / goal sebelumnya).

Ini juga dilaporkan sebagai bug potensial MDEPLOY-158:: deploy: deploy tidak berfungsi hanya untuk Menerapkan artefak ke repo Jarak Jauh Maven

Tapi kemudian ditolak karena bukan masalah.

The deployAtEndpilihan konfigurasi dari maven-deploy-plugintidak akan membantu baik dalam skenario tertentu karena kita memiliki langkah-langkah pekerjaan menengah untuk mengeksekusi:

Apakah setiap proyek harus diterapkan selama fase penerapannya sendiri atau di akhir pembuatan multimodule. Jika disetel ke truedan build gagal, tidak ada proyek reaktor yang diterapkan. (eksperimental)

Lantas, bagaimana cara memperbaikinya?
Cukup jalankan yang berikut ini dalam langkah ketiga / terakhir yang serupa:

mvn jar:jar deploy:deploy

Ini maven-jar-plugintidak akan membuat ulang jar apa pun sebagai bagian dari build Anda, berkat forceCreationopsinya yang disetel falsesecara default:

Wajibkan plugin jar untuk membuat JAR baru meskipun tidak ada konten yang tampak berubah. Secara default, plugin ini melihat apakah output jar ada dan input tidak berubah. Jika kondisi ini benar, plugin mengabaikan pembuatan jar.

Tapi itu akan mengisi konteks pembangunan dengan baik untuk kita dan membuat deploy:deploybahagia. Tidak ada tes untuk dilewati, tidak ada profil untuk ditambahkan. Yang Anda butuhkan: kecepatan.


Catatan tambahan: jika Anda menggunakan build-helper-maven-plugin, buildnumber-maven-pluginatau plugin serupa lainnya untuk menghasilkan meta-data yang nantinya digunakan oleh maven-jar-plugin(misalnya entri untuk file Manifes), kemungkinan besar Anda memiliki eksekusi yang ditautkan ke validatefase dan Anda masih ingin memilikinya selama yang jar:jarmembangun langkah (dan belum menjaga eksekusi cepat). Dalam hal ini overhead yang hampir tidak berbahaya adalah dengan menjalankan validate fase sebagai berikut:

mvn validate jar:jar deploy:deploy

Namun catatan tambahan lainnya: jika Anda belum jar, katakanlah, warmengemas, gunakan war:warsebelum menginstal / menyebarkan sebagai gantinya.

Gotcha seperti yang ditunjukkan di atas, periksa perilaku dalam proyek multi modul.

A_Di-Matteo
sumber
8
Berlari ke skenario yang tepat ini. Penulisan yang fantastis - harus ada di FAQ penerapan plugin alih-alih penjelasan "Anda tidak bisa melakukan itu" yang cukup singkat.
markdsievers
Siapa sangka bahwa toples toples bisa berguna setelah semua;)
wearego
Lihat solusi saya untuk proyek mutli-modul: stackoverflow.com/a/57824874/318174
Adam Gent
solusi ini berfungsi dengan baik untuk proyek multi-modul saya @AdamGent
karakays
Penjelasan yang bagus. Menjelaskan dengan tepat skenario saya dengan server Jenkins saya.
wimnat
14

Balasan ini adalah pertanyaan yang sangat lama untuk membantu orang lain menghadapi masalah ini.

Saya menghadapi kesalahan yang gagal ini saat saya mengerjakan Javaproyek saya menggunakan 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

ini gagal terjadi, ketika saya memilih di install:installbawah Plugins - install, seperti yang ditunjukkan dengan panah merah di gambar di bawah ini.

Pilih Pilihan yang Salah

Setelah saya menjalankan yang dipilih di installbawah Lifecycleseperti yang diilustrasikan di atas, masalah hilang, dan kompilasi instalasi maven saya berhasil dibangun.

ArifMustafa
sumber
6

Saya memiliki masalah yang sama. Pesan kesalahan untuk saya tidak lengkap. Tetapi dalam kasus saya, saya telah menambahkan toples generasi dengan sumber. Dengan menempatkan kode ini di 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>

Jadi pada tahap deploy saya mengeksekusi source: jar goal yang menghasilkan jar dengan sumber. Dan penerapan diakhiri dengan BUILD SUCCESS

lstrzelecki.dll
sumber
2

Anda harus menghapus file target seperti di jar dan lainnya Di C: drive folder Anda di .m2 lihat lokasi tempat menginstal dan hapus file .jar, file Snaphot dan hapus file target kemudian bersihkan aplikasi yang Anda temukan itu akan dijalankan

Mengumpat
sumber
Nah solusi parsial.
Jasper Lankhorst
2

Kesalahan ini muncul saat menggunakan maven-install-plugin versi 3.0.0-M1 (atau serupa)

Seperti yang telah disebutkan di atas dan juga di sini versi plugin berikut berfungsi:

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

Sementara jawaban @ A_Di-Matteo berfungsi untuk non multimodule, saya punya solusi untuk multimodule.

Solusinya adalah dengan menimpa setiap konfigurasi plugin agar mengikat ke fase nonekecuali plugin jar / war / ear dan tentu saja plugin deploy. Bahkan jika Anda memiliki satu modul tes dasar saya menunjukkan ini menjadi sedikit lebih cepat (untuk alasan saya tidak tahu) kinerja yang bijaksana.

Jadi triknya adalah membuat profil yang melakukan hal di atas yang diaktifkan saat Anda hanya ingin menerapkan.

Di bawah ini adalah contoh dari salah satu proyek saya yang menggunakan plugin shade dan oleh karena itu saya harus mengganti plugin jar untuk tidak menimpa:

    <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>

Sekarang jika saya menjalankannya mvn deploy -Pdeployhanya akan menjalankan jar dan menerapkan plugin.

Bagaimana Anda dapat mengetahui plugin mana yang perlu Anda timpa adalah dengan menjalankan penerapan dan melihat log untuk melihat plugin mana yang sedang berjalan. Pastikan untuk melacak idkonfigurasi plugin yang merupakan parens setelah nama plugin.

Adam Gent
sumber
0

Saya memiliki masalah yang sama tetapi saya menjalankan mvn install pada awalnya (bukan install: install seperti yang disebutkan sebelumnya).

Solusinya adalah memasukkan:

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

Ke bagian manajemen plugin.

Denys
sumber