java - 提取jar时spring boot运行JarLauncher
问题描述
我正在使用 spring boot 构建一个胖罐,胖罐使用
java -jar app.jar
问题是我正在使用 docker 并且我想扩展 jar 内容以获得更好的可用性,我执行以下操作来提取:
unzip app.jar
现在我使用以下内容运行 jar:
java -cp "." org/springframework/boot/loader/JarLauncher
我收到以下错误:
Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jaxRsServer' defined in class path resource
所以它无法找到我的 bean 虽然它已配置:
@SpringBootApplication(exclude = SecurityAutoConfiguration.class)
@ImportResource("classpath:spring/beans_context.xml")
public class SpringBootJaxrsApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootJaxrsApplication.class, args);
}
}
beans_context.xml:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<context:annotation-config />
<import resource="classpath:META-INF/spring/*_context.xml"/>
解决方案
您使用的是哪个 Spring Boot 版本?从 2.3.0 开始,可以使用新的分层模式来打包胖 JAR。启用分层模式后,您可以执行类似的操作来构建 Docker 映像。
FROM adoptopenjdk:11-jre-hotspot as builder
WORKDIR application
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} application.jar
RUN java -Djarmode=layertools -jar application.jar extract
FROM adoptopenjdk:11-jre-hotspot
WORKDIR application
COPY --from=builder application/dependencies/ ./
COPY --from=builder application/snapshot-dependencies/ ./
COPY --from=builder application/resources/ ./
COPY --from=builder application/application/ ./
ENTRYPOINT ["java", "org.springframework.boot.loader.JarLauncher"]
请注意,命令是java org.springframework.boot.loader.JarLauncher
.
该示例在 Spring 博客的这篇文章中得到了完整的解释。有关 Spring Boot 2.3 中分层如何工作的更多信息,您可以参考这篇文章,同样来自 Spring 博客。
相反,如果您使用的是旧版本的 Spring Boot,则可以按照本文中的说明构建Dockerfile。在这种情况下,入口点将是java -cp app:app/lib/* hello.Application
.
FROM openjdk:8-jdk-alpine
RUN addgroup -S spring && adduser -S spring -G spring
USER spring:spring
ARG DEPENDENCY=target/dependency
COPY ${DEPENDENCY}/BOOT-INF/lib /app/lib
COPY ${DEPENDENCY}/META-INF /app/META-INF
COPY ${DEPENDENCY}/BOOT-INF/classes /app
ENTRYPOINT ["java","-cp","app:app/lib/*","hello.Application"]
推荐阅读
- python - Python 表格 - 无法导入名称包装器
- angular - 类型错误:无法添加属性 1,对象不可扩展↵ 在 Array.push (
) - java - OpenShift Payara 内存 - 无法访问管理员
- python - 如何修复 cmake 错误:无法将可执行文件输出到 COPY_FILE 指定的输出文件
- intellij-idea - 在 IntelliJ 的被调用者层次结构中选择
- android - 标记在谷歌地图上显示错误的位置
- c# - 如何从 MVC 控制器返回本地化文本
- javascript - JSON.parse(myArray) 失败
- php - 如何使用 PHP/MySQL 限制用户在一个月内仅上传三张图片
- angular - 如何在角度应用程序中将 dir='rtl' 添加到 html 标记