Java SpringBootMaven插件-无Boot-INF目录

Java SpringBootMaven插件-无Boot-INF目录,java,spring,maven,spring-boot,spring-boot-maven-plugin,Java,Spring,Maven,Spring Boot,Spring Boot Maven Plugin,在SpringBootMaven插件的1.3.8.RELEASE版本和1.4.0.RELEASE版本之间,生成的包结构发生了变化(如果提取uber jar文件) 1.3.8.发布com、lib、META-INF和org目录 1.4.0.RELEASE有BOOT-INF、META-INF和org目录 基本上从1.4.0.RELEASE开始-所有的类和lib都在BOOT-INF目录中。 因此,当您尝试在AmazonLambda上运行SpringBoot项目时,它说没有找到一个jar,因为它无法读取新

在SpringBootMaven插件的1.3.8.RELEASE版本和1.4.0.RELEASE版本之间,生成的包结构发生了变化(如果提取uber jar文件) 1.3.8.发布com、lib、META-INF和org目录 1.4.0.RELEASE有BOOT-INF、META-INF和org目录 基本上从1.4.0.RELEASE开始-所有的类和lib都在BOOT-INF目录中。 因此,当您尝试在AmazonLambda上运行SpringBoot项目时,它说没有找到一个jar,因为它无法读取新的SpringBoot Uber jar结构

我的问题是——在较新版本的Spring Boot Maven插件中,是否有可能让它生成与1.3.9.RELEASE版本相同的uber jar结构

我尝试了maven shade插件,但这会导致其他问题

非常感谢您的帮助

谢谢
Damien

解决方案是在pom.xml文件中添加插件的模块布局

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <layout>MODULE</layout>
    </configuration>
    <executions>
        <execution>
            <goals>
                <goal>repackage</goal>
            </goals>
        </execution>
    </executions>
</plugin>

org.springframework.boot
springbootmaven插件
模块
重新包装

对我来说,解决方案有点阴险……我将spring boot maven插件嵌套在pluginManagement下(见下文)。啊

令人讨厌的是,当我运行mvn spring boot:run时,spring boot运行正常,运行应用程序!直到我们尝试部署到PCF(作为spring引导JAR)时,我们才发现二进制文件的格式有问题

<build>

  <!-- 
    DON'T DO THIS!! 
  -->
  <pluginManagement>

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

  </pluginManagement>

  <!-- 
    DO THIS INSTEAD!! 
  -->      
<plugins>

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

  </plugins>

</build>

org.springframework.boot
springbootmaven插件
${spring.boot.version}
重新包装
构建信息
org.springframework.boot
springbootmaven插件
${spring.boot.version}
重新包装
构建信息
一旦我从POM中删除了pluginManagement标记,现在就可以得到./BOOT-INF结构。请记住,pluginManagement通常用于父pom结构,您希望在其他模块中使用该插件的配置

上面的答案是

<layout>MODULE</layout>

第二个分类器具有较新的BOOT-INF/etc结构。

在我的例子中,我使用spring BOOT 2.X,在
maven依赖插件之后声明了
spring BOOT maven插件
(我用来在Docker中解包并创建分解的应用程序),而且必须在解包之前,这是有意义的,它是在spring boot maven插件执行之前解包的。下一次,我将宣布它是插件链中的第一件事,在这方面损失了1个多小时。希望它能帮助别人

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <mainClass>${spring.boot.mainClass}</mainClass>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <executions>
                <execution>
                    <id>unpack</id>
                    <phase>package</phase>
                    <goals>
                        <goal>unpack</goal>
                    </goals>
                    <configuration>
                        <artifactItems>
                            <artifactItem>
                                <groupId>${project.groupId}</groupId>
                                <artifactId>${project.artifactId}</artifactId>
                                <version>${project.version}</version>
                            </artifactItem>
                        </artifactItems>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

org.springframework.boot
springbootmaven插件
${spring.boot.mainClass}
org.apache.maven.plugins
maven依赖插件
打开
包裹
打开
${project.groupId}
${project.artifactId}
${project.version}

我使用的是Gradle,而不是Maven,这就是我必须做的:

1-在我的build.gradle中,我添加了中定义的以下属性

2-未写入我的依赖项文件夹

ARG DEPENDENCY=target/dependency
相反,我在另一个文件夹中找到了它,因此我在Dockerfile中更改了此属性:

ARG DEPENDENCY=build/dependency

有了这个,我的构建成功了。

为什么没有人将它标记为正确答案。我升级spring boot时也遇到了类似的问题。被博士们搞糊涂了。春天的描述。添加这一块很有效。模块如何为build.gradle执行此操作?我正在使用下面的插件类路径“org.springframework.boot:spring boot gradle plugin:1.4.2.RELEASE”,因此,我的胖jar具有下面的结构boot-INF MATA-INF org.springframework.boot.loader,但我想要下面的结构,如META-INFIt所说,无法执行目标org.springframework.boot:springbootmaven插件:2.1.2.版本:重新打包(重新打包)项目businessunit服务上的businessunit:无法解析mojo org.springframework.boot:spring boot maven插件的配置:2.1.2.版本:重新打包:无法将“模块”转换为枚举:无枚举常量org.springframework.boot.maven.RepackageMojo.LayoutType.MODULE->[帮助1]通过将maven shade插件声明放在pom.xml中的spring boot maven插件声明之前,我的设置也得以运行。生成的shade jar按预期在根目录中包含所有内容,而Spring引导jar按预期在boot-INF中包含所有内容。
buildscript {
    ...
    dependencies {
        ...
        classpath('gradle.plugin.com.palantir.gradle.docker:gradle-docker:0.13.0')
    }
}

group = 'springio'

...
apply plugin: 'com.palantir.docker'

task unpack(type: Copy) {
    dependsOn bootJar
    from(zipTree(tasks.bootJar.outputs.files.singleFile))
    into("build/dependency")
}
docker {
    name "${project.group}/${bootJar.baseName}"
    copySpec.from(tasks.unpack.outputs).into("dependency")
    buildArgs(['DEPENDENCY': "dependency"])
}
ARG DEPENDENCY=target/dependency
ARG DEPENDENCY=build/dependency