idea打包jib
我最近一直在开发Spring Boot应用程序,为了加快开发速度,我添加了Developer Tools作为依赖项。
默认情况下,只有在稍后以调试模式运行时,才可以更新在HotSpot JVM中加载的类,并且仅对于有关方法实现的更改。 这意味着向类添加属性需要完全重新启动。
DevTools是对它的改进。 它通过调整标准的类加载机制来工作:一个类加载器专用于库,另一种类用于项目的类。 如果某个类发生了更改,并且无法通过HotSpot重新加载它,则无需重新启动整个JVM,而是直接丢弃第二个类加载器,然后再次加载所有类。 由于与库和JDK中的类数量相比,项目中的类数量非常少,因此与完全重启相比,此方法非常快。 另外,从保持会话,缓存等中受益。
所有这些都可以缩短开发周期。 它也可以免费替代JRebel-尽管仅限于基于Spring Boot的项目。
问题
为了在Docker容器中分发Spring Boot应用程序,我使用了Maven Jib插件 。 Jib能够创建Docker映像,而无需任何Docker运行时!
因为Jib是Maven插件,所以已将其插入Maven配置,并且可以推断出很多东西。 包括主类和JAR依赖项。 因此,默认值使用专用的java
命令创建Docker映像, 例如 :
java-cp /app/resources:/app/classes:/app/libs/ *\
ch.frankel.boot.zerodowntime.ZeroDowntimeApplicationKt
因此,它不是分发的可执行JAR,而只是目录结构。 主要好处是,构建生命周期可以将自身限制在编译阶段。 因此,执行Maven Spring Boot插件既不必要也不有用。
运行完全打包的应用程序时,将自动禁用开发人员工具。 如果您的应用程序是从java -jar启动的,或者是从特殊的类加载器启动的,则将其视为“生产应用程序”。
不幸的是,由于该应用程序未作为JAR运行,因此DevTools JAR本身包含在映像依赖项中。 这样可以远程访问该应用程序 。 有理由允许这样做,但在所有其他情况下,应将其视为安全问题。
让我们修复它。
解决方案
第一步是将DevTools JAR隔离到专用的Maven配置文件中:
<profiles>
<profile>
<id> dev </id>
<dependencies>
<dependency>
<groupId> org.springframework.boot </groupId>
<artifactId> spring-boot-devtools </artifactId>
<scope> runtime </scope>
</dependency>
</dependencies>
</profile>
</profiles>
现在,可以使用此配置文件,希望只能在开发期间使用。 但是,Maven配置文件是在构建时而非运行时应用的 。 因此,在IntelliJ IDEA中,更改运行配置的设置无济于事。
而是转到Maven视图,找到“ Profiles项,然后检查相关项。
此时,每个基于IntelliJ的构建都将使用包含DevTools的dev
配置文件,而最终的基于Jib的Docker映像则不会。
翻译自: https://blog.frankel.ch/spring-devtools-jib-intellij-idea/
idea打包jib