spring Sping Boot Maven插件-无BOOT-INF目录

ars1skjm  于 12个月前  发布在  Spring
关注(0)|答案(6)|浏览(156)

在spring-boot-maven-plugin的1.3.8.RELEASE版本和1.4.0.RELEASE版本之间-生成的包结构发生了变化(如果你解压缩了uber jar文件)1.3.8.RELEASE com,lib,META-INF和org目录1.4.0.RELEASE有一个BOOT-INF,META-INF和org目录基本上从1.4.0.RELEASE开始-所有的类和库都在BOOT-INF目录中。因此-当你尝试在Amazon Lambda上运行Spring Boot项目时-它说有一个jar没有找到,因为它无法读取新的Sping Boot Uber jar结构
我的问题是-在Sping Boot Maven Plugin的新版本中,是否有可能让它生成与1.3.9.RELEASE版本相同的结构的uber jar?
我尝试了maven-shade-plugin -但这会导致其他问题
任何帮助都非常感谢
谢谢达米恩

q5iwbnjs

q5iwbnjs1#

解决方案是在pom.xml文件中为插件添加MODBLE布局

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

字符串

7d7tgy0s

7d7tgy0s2#

在我的情况下,我使用的是spring Boot 2.X,我在maven-dependency-plugin之后声明了spring-boot-maven-plugin(我用来解包并在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>

字符串

8wtpewkr

8wtpewkr3#

上面的答案与

<layout>MODULE</layout>

字符串
不再工作,这是因为 layout 元素在Sping Boot 2.x中被弃用。我正在使用Sping Boot 2.0.x,我在github上发现了这个有用的评论:
对模块布局的支持在Sping Boot 2.0中被删除,而在1.5中被弃用。不幸的是,Maven插件的文档更新被遗漏了,所以我们可以利用这个问题来解决这个问题。你应该使用自定义的LayoutFactory。
但由于我不想实现LayoutFactory,我尝试了下面的第二个解决方案,实际上重新打包并创建了一个额外的jar,并给出了一个分类器名称:
这是由于Sping Boot 1.4中可执行jar的布局发生了变化。Application classes现在打包在BOOT-INF/classes中。您的客户端模块依赖于重新打包的web模块的fat jar。由于新的布局,这意味着客户端模块无法再加载web模块的classes。如果您想使用web模块作为依赖项,您应该配置 Boot 的重新打包以将分类器应用于fat jar。例如:

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                    <configuration>
                        <classifier>exec</classifier>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>


这样做将允许其他模块依赖于原始jar,而原始jar没有嵌入模块的依赖项,并且在jar的根目录中有类。
一个原始的jar有相同的结构,因为我想像

com.my-package.foo.bar
META-INF


第二类分类器采用了较新的结构,如BOOT-INF/等。

wlzqhblo

wlzqhblo4#

对我来说,这个解决方案有点阴险.
讨厌的事情是,当我运行mvn spring-boot:run时,spring boot运行得很好,并且运行app!直到我们试图部署到PCF(作为spring-boot apps),我们才得到一个错误,即二进制文件的格式有问题。

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

字符串
一旦我从POM中删除了pluginManagement标签,我现在将获得./BOOT-INF结构。请记住,pluginManagement通常用于parent-pom结构,您希望该插件的配置在其他模块中使用。

m4pnthwp

m4pnthwp5#

我们如何使用gradle实现相同的结果?我已经从spring-boot-gradle-plugin 1.2.5切换到1.4.0,现在jar结构已经改变。这个解决方案<layout>MODULE</layout>在gradle中有等效的吗?

roejwanj

roejwanj6#

我用的是Gradle而不是Maven,这是我必须做的:
1-在我的build.gradle中,我添加了以下在https://spring.io/guides/gs/spring-boot-Docker/中定义的属性。

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"])
}

字符串
2-我的依赖文件夹没有被写入

ARG DEPENDENCY=target/dependency


相反,我将其定位在另一个文件夹中,因此我在Dockerfile中更改了此属性:

ARG DEPENDENCY=build/dependency


通过这种方式,我获得了成功。

相关问题