Spring Boot - pom pai quando você já tem um pom pai

184

Existe uma abordagem específica recomendada para a inclusão do pom pai com inicialização por mola em projetos que já possuem um POM pai necessário?

O que você recomenda para projetos que precisam se estender de um pai organizacional (isso é extremamente comum e até algo que muitos / a maioria dos projetos publicou no Maven central, dependendo dos repositórios de feeds de onde eles vêm). A maioria das coisas de construção está relacionada à criação de JARs executáveis ​​(por exemplo, executando o Tomcat / Jetty incorporado). Existem maneiras de estruturar as coisas para que você possa obter todas as dependências sem se estender de um pai (semelhante à composição versus herança). Você não pode obter um material de construção dessa maneira.

Portanto, é preferível incluir todo o pom pai de inicialização por mola dentro do POM pai necessário ou simplesmente ter uma dependência de POM no arquivo POM do projeto.

Outras opções?

TIA,

Scott

Scott C.
fonte

Respostas:

179

Você pode usar o spring-boot-starter-parent como um "bom" (consulte Spring e Jersey outros projetos que suportam esse recurso agora) e incluí-lo apenas na seção de gerenciamento de dependências com scope = import. dos benefícios de usá-lo (ou seja, gerenciamento de dependências) sem substituir as configurações no pai ou mãe atual.

As duas principais coisas que ele faz são

  1. defina uma carga de propriedades para configurar rapidamente versões de dependências que você deseja substituir
  2. configure alguns plugins com a configuração padrão (principalmente o plug-in do Spring Boot). Portanto, essas são as coisas que você terá que fazer manualmente se usar seu próprio pai.

Exemplo fornecido na documentação do 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
fonte
1
Eu estou supondo que isso puxa os plugins - sombra etc?
Chrislovecnm
3
Não. Leia o link: "você ainda pode manter os benefícios do gerenciamento de dependências (mas não o gerenciamento de plugins)".
Dave Syer
1
@DaveSyer Por favor, esclareça: 1: Quando eu tiver meu costume, project-parentposso adicionar spring-boot-starter-parentisso project-parent- está tudo bem? Eu também preciso spring-boot-dependenciesnessa situação? 2: Projeto normal de boot por mola Eu corro usando spring-boot: run. Como executar o projeto com pom pai diferente?
precisa saber é o seguinte
1
O trecho de código acima é suficiente para obter os recursos de gerenciamento de dependências. Se você quiser plug-ins (como spring-boot:run), precisará confutá-los separadamente. Você pode copiar e colar do pai de inicialização, se desejar.
Dave Syer
3
Eu sei que é um tópico antigo, mas me ajudou muito, obrigado. Acabei lendo sobre esse mecanismo na fonte maven.apache.org/guides/introduction/… . Isso explica muito.
bazeusz
42

Atualizar 2018-01-04 com 1.5.9.RELEASE.

Tenho código completo e exemplo executável aqui https://www.surasint.com/spring-boot-with-no-parent-example/

Você precisa disso como um básico

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

Mas isso não basta, você também precisa definir explicitamente o objetivo do plugin spring-boot-maven (se você usar o Spring Boot como pai, não precisará defini-lo explicitamente)

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

Caso contrário, você não poderá criar como jar executável ou guerra.

Ainda não, se você estiver usando JSP, precisará do seguinte:

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

Caso contrário, você receberá esta mensagem de erro:

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

NÃO NÃO, isso ainda não é suficiente se você estiver usando o Maven Profile e o Resource Filter com Spring Boot com "@" em vez de "$ {}" (como este exemplo https://www.surasint.com/spring-boot-maven -resource-filter / ). Então você precisa adicionar isso explicitamente

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

E isso em

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

Veja o exemplo no link https://www.surasint.com/spring-boot-with-no-parent-example/ .

Surasin Tancharoen
fonte
@Arvind um aviso, meu exemplo é 1.5.9. Você deve usar o 1.5.11 (versão ontem) porque esta versão possui uma correção para um sério problema de segurança.
Surasin Tancharoen 06/04/19
como mencionado no seu blog, tentei adicionar o maven-resources-plugin, mas ainda está me dando "nenhum atributo principal do manifesto, no destino". Eu tentei executar o spring-boot: run, isso também não está funcionando :(
sagar27
@ sagar27 qual versão você está usando 1.5.X ou 2.x? se for 2.x, pode precisar de mais informações.
Surasin Tancharoen
Obrigado !! Você salvou minha vida
Jey Atiwat
0

De acordo com a resposta de Surasin Tancharoen, você também pode definir o plugin maven surefire

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

e, possivelmente, incluir plug-ins com rapidez

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