Spring Boot - pom induk ketika Anda sudah memiliki pom induk

184

Apakah ada pendekatan yang disarankan khusus untuk memasukkan pom induk spring-boot ke dalam proyek yang sudah memiliki POM induk yang diperlukan?

Apa yang Anda rekomendasikan untuk proyek-proyek yang perlu diperluas dari induk organisasi (ini sangat umum dan bahkan sesuatu yang banyak / sebagian besar proyek diterbitkan ke pusat Maven tergantung pada repo pengumpan asal mereka). Sebagian besar materi pembuatan terkait dengan pembuatan JAR yang dapat dieksekusi (mis. Menjalankan embedded Tomcat / Jetty). Ada beberapa cara untuk menyusun hal-hal sehingga Anda bisa mendapatkan semua dependensi tanpa memanjang dari orang tua (mirip dengan komposisi vs warisan). Anda tidak bisa mendapatkan barang bangunan dengan cara itu.

Jadi apakah lebih baik untuk memasukkan semua pom induk spring-boot di dalam POM induk yang diperlukan atau hanya memiliki ketergantungan POM dalam file POM proyek.

Pilihan lain?

TIA,

Scott

Scott C.
sumber

Jawaban:

179

Anda dapat menggunakan spring-boot-starter-parent seperti "bom" (lih Spring dan Jersey proyek lain yang mendukung fitur ini sekarang), dan memasukkannya hanya di bagian manajemen ketergantungan dengan scope = import. Dengan begitu Anda mendapatkan banyak manfaat menggunakannya (mis. manajemen ketergantungan) tanpa mengganti pengaturan pada orang tua Anda yang sebenarnya.

2 hal utama lainnya yang dilakukannya adalah

  1. mendefinisikan pemuatan properti untuk menyetel versi dependensi yang ingin Anda timpa secara cepat
  2. konfigurasikan beberapa plugin dengan konfigurasi default (terutama plugin Spring Boot maven). Jadi itu adalah hal-hal yang harus Anda lakukan secara manual jika Anda menggunakan orang tua Anda sendiri.

Contoh disediakan dalam dokumentasi Spring Boot :

<dependencyManagement>
    <dependencies>
        <dependency>
            <!-- Import dependency management from Spring Boot -->
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>2.1.3.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
Dave Syer
sumber
1
Saya kira ini tidak menarik plugin - teduh dll?
chrislovecnm
3
Tidak. Baca tautannya: "Anda masih dapat memanfaatkan manfaat manajemen ketergantungan (tetapi bukan manajemen plugin)".
Dave Syer
1
@DaveSyer Tolong jelaskan: 1: Ketika saya memiliki kebiasaan saya, project-parentsaya dapat menambahkan spring-boot-starter-parentini project-parent- apakah tidak apa-apa? Apakah saya juga perlu spring-boot-dependenciesdalam situasi seperti itu? 2: Proyek normal spring-boot yang saya jalankan menggunakan spring-boot: run. Bagaimana menjalankan proyek dengan pom induk yang berbeda?
jsosnowski
1
Cuplikan kode di atas cukup untuk mendapatkan fitur manajemen dependensi. Jika Anda menginginkan plugin (seperti spring-boot:run), Anda perlu mengacaukannya secara terpisah. Anda dapat menyalin tempel dari induk Boot jika Anda mau.
Dave Syer
3
Saya tahu ini adalah utas lama tetapi sangat membantu saya, terima kasih. Saya akhirnya membaca tentang mekanisme ini di sumber maven.apache.org/guides/introduction/… . Itu menjelaskan banyak hal.
bazeusz
42

Perbarui 2018-01-04 dengan 1.5.9.RELEASE.

Saya memiliki kode lengkap dan contoh yang dapat dijalankan di sini https://www.surasint.com/spring-boot-with-no-parent-example/

Anda membutuhkan ini sebagai dasar

   <dependencyManagement>
        <dependencies>
            <dependency>
                <!-- Import dependency management from Spring Boot -->
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${springframework.boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

Tapi itu tidak cukup, Anda juga perlu secara eksplisit menentukan tujuan untuk pegas-boot-maven-plugin (Jika Anda menggunakan Pegas Boot sebagai induk, Anda tidak perlu mendefinisikan ini secara eksplisit)

    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <version>${springframework.boot.version}</version>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>

Kalau tidak, Anda tidak dapat membangun sebagai toples atau perang yang dapat dieksekusi.

Belum, jika Anda menggunakan JSP, Anda harus memiliki ini:

<properties>    
  <failOnMissingWebXml>false</failOnMissingWebXml>
</properties>

Jika tidak, Anda akan mendapatkan pesan kesalahan ini:

    [ERROR] Failed to execute goal org.apache.maven.plugins:maven-war-plugin:2.2:war (default-war) on project spring-boot-09: Error assembling WAR: webxml attribute is required (or pre-existing WEB-INF/web.xml if executi
ng in update mode) -> [Help 1]

TIDAK, ini masih belum cukup jika Anda menggunakan Maven Profile dan Filter Sumber Daya dengan Spring Boot dengan "@" alih-alih "$ {}" (seperti contoh ini https://www.surasint.com/spring-boot-maven -sumber daya-filter / ). Maka Anda perlu menambahkan ini secara eksplisit

    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
        </resource>
    </resources>

Dan ini masuk

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-resources-plugin</artifactId>
            <version>2.7</version>
            <configuration>
                <delimiters>
                    <delimiter>@</delimiter>
                </delimiters>
                <useDefaultDelimiters>false</useDefaultDelimiters>
            </configuration>
        </plugin>

Lihat contoh di tautan https://www.surasint.com/spring-boot-with-no-parent-example/ .

Surasin Tancharoen
sumber
@Atkan peringatan, contoh saya adalah 1.5.9. Anda harus menggunakan 1.5.11 (rilis kemarin) karena versi ini memiliki perbaikan untuk masalah keamanan yang serius.
Surasin Tancharoen
seperti yang disebutkan blog Anda, saya mencoba untuk menambahkan maven-resources-plugin, tetapi masih memberi saya "tidak ada atribut manifes utama, dalam target". Saya mencoba menjalankan spring-boot: run, ini juga tidak berhasil :(
sagar27
@ sagar27 versi mana yang Anda gunakan 1.5.X atau 2.x? jika 2.x, mungkin perlu lebih banyak.
Surasin Tancharoen
Terima kasih !! Anda menyelamatkan hidup saya
Jey Atiwat
0

Sesuai jawaban Surasin Tancharoen, Anda mungkin juga ingin menentukan plugin maven surefire

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>${maven-surefire-plugin.version}</version>
        </plugin>

dan mungkin menyertakan plugin gagal-cepat

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-failsafe-plugin</artifactId>
        <version>${maven-failsafe-plugin.version}</version>
        <executions>
            <execution>
                <goals>
                    <goal>integration-test</goal>
                    <goal>verify</goal>
                </goals>
            </execution>
        </executions>
    </plugin>
trenunu
sumber