Spring Boot - pom cha khi bạn đã có cha mẹ


184

Có một cách tiếp cận cụ thể nào được đề xuất để đưa pom cha khởi động vào các dự án đã có POM gốc bắt buộc không?

Bạn có đề xuất gì cho các dự án cần mở rộng từ cha mẹ tổ chức (điều này cực kỳ phổ biến và thậm chí là một cái gì đó nhiều / hầu hết các dự án được xuất bản cho trung tâm Maven tùy thuộc vào các repos trung chuyển mà chúng đến từ). Hầu hết các công cụ xây dựng có liên quan đến việc tạo các JAR thực thi (ví dụ: chạy Tomcat / Jetty nhúng). Có nhiều cách để cấu trúc mọi thứ để bạn có thể nhận được tất cả các phụ thuộc mà không cần mở rộng từ cha mẹ (tương tự như thành phần so với thừa kế). Bạn không thể có được một công cụ xây dựng theo cách đó mặc dù.

Vì vậy, tốt hơn là bao gồm tất cả các pom cha khởi động mùa xuân bên trong POM cha được yêu cầu hoặc đơn giản là có một phụ thuộc POM trong tệp POM dự án.

Sự lựa chọn khác?

TIA

Scott

Câu trả lời:


179

Bạn có thể sử dụng cha mẹ khởi động lò xo như "bom" (cf Spring và Jersey các dự án khác hỗ trợ tính năng này ngay bây giờ) và chỉ đưa nó vào phần quản lý phụ thuộc với scope = import. Đó là cách bạn nhận được rất nhiều về lợi ích của việc sử dụng nó (tức là quản lý phụ thuộc) mà không thay thế các cài đặt trong cha mẹ thực tế của bạn.

Hai điều chính khác nó làm là

  1. xác định tải các thuộc tính để nhanh chóng thiết lập các phiên bản phụ thuộc mà bạn muốn ghi đè
  2. cấu hình một số plugin có cấu hình mặc định (chủ yếu là plugin Spring Boot maven). Vì vậy, đó là những điều bạn sẽ phải làm thủ công nếu bạn sử dụng cha mẹ của chính mình.

Ví dụ được cung cấp trong tài liệu 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>

1
Tôi đoán điều này không kéo theo các plugin - bóng râm vv?
chrislovecnm

3
Không. Đọc liên kết: "bạn vẫn có thể giữ lợi ích của việc quản lý phụ thuộc (nhưng không phải quản lý plugin)".
Dave Syer

1
@DaveSyer Xin làm rõ: 1: Khi tôi có tùy chỉnh của mình, project-parenttôi có thể thêm spring-boot-starter-parentvào điều này project-parent- có ổn không? Tôi cũng cần spring-boot-dependenciestrong tình huống như vậy? 2: Dự án spring-boot bình thường Tôi chạy bằng spring-boot: run. Làm thế nào để chạy dự án với pom cha mẹ khác nhau?
jsosnowski

1
Đoạn mã trên là đủ để có được các tính năng quản lý phụ thuộc. Nếu bạn muốn các plugin (như spring-boot:run), bạn cần phải phân tách chúng một cách riêng biệt. Bạn có thể sao chép dán từ cha mẹ Boot nếu bạn muốn.
Dave Syer

3
Tôi biết đó là một chủ đề cũ nhưng nó đã giúp tôi rất nhiều, cảm ơn. Cuối cùng tôi đã đọc về cơ chế này tại nguồn maven.apache.org/guides/int sinhtion / . Nó giải thích rất nhiều.
bazeusz

42

Cập nhật 2018-01-04 với 1.5.9.RELEASE.

Tôi có mã đầy đủ và ví dụ có thể chạy ở đây https://www.surasint.com/spring-boot-with-no-parent-example/

Bạn cần điều này như là một cơ bản

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

Nhưng điều đó là chưa đủ, bạn cũng cần xác định rõ ràng mục tiêu cho spring-boot-maven-plugin (Nếu bạn sử dụng Spring Boot làm cha mẹ, bạn không phải xác định rõ ràng điều này)

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

Nếu không, bạn không thể xây dựng như bình thực thi hoặc chiến tranh.

Chưa, nếu bạn đang sử dụng JSP, bạn cần phải có điều này:

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

Nếu không, bạn sẽ nhận được thông báo lỗi này:

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

KHÔNG KHÔNG, điều này vẫn chưa đủ nếu bạn đang sử dụng Bộ lọc tài nguyên và hồ sơ Maven với Spring Boot với "@" thay vì "$ {}" (như ví dụ này https://www.surasint.com/spring-boot-maven -resource-bộ lọc / ). Sau đó, bạn cần phải thêm điều này vào

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

Và cái này trong

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

Xem ví dụ trong liên kết https://www.surasint.com/spring-boot-with-no-parent-example/ .


@ Trả lời một cảnh báo, ví dụ của tôi là 1.5.9. Bạn nên sử dụng 1.5.11 (phát hành ngày hôm qua) vì phiên bản này có một bản sửa lỗi cho vấn đề bảo mật nghiêm trọng.
Surasin Tancharoen

như đã đề cập trên blog của bạn, tôi đã cố gắng thêm maven-resource-plugin, nhưng nó vẫn cho tôi "không có thuộc tính bảng kê khai chính, trong mục tiêu". Tôi đã thử chạy spring-boot: run, cái này cũng không hoạt động :(
sagar27

@ sagar27 phiên bản nào bạn đang sử dụng 1.5.X hoặc 2.x? nếu nó là 2.x, nó có thể cần nhiều thứ hơn.
Surasin Tancharoen

Cảm ơn bạn !! Bạn đã cứu mạng tôi
Jey Atiwat

0

Theo câu trả lời của Surasin Tancharoen, bạn cũng có thể muốn xác định plugin maven Surefire

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

và có thể bao gồm plugin không nhanh

    <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>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.