【问题标题】:After upgrading to Spring Boot 1.3.1, JVM initialization error升级到Spring Boot 1.3.1后,JVM初始化错误
【发布时间】:2016-01-04 21:27:41
【问题描述】:

我最近升级了我的应用程序以使用 v1.3.1,以便我可以删除管理上下文路径问题的解决方法。当我现在尝试启动应用程序时,它只是抱怨无效的 JVM 参数,但除了春季启动版本更改之外,jvm 参数或应用程序没有变化。

我并排安装了旧(w/boot v1.3.0)和新(w/boot v1.3.1)版本,init.d 服务脚本似乎有问题。以下是我在 vagrant ubuntu 主机上并排安装的不同版本的示例服务 -

v0.0.1-218655-SNAPSHOT = with spring boot v1.3.1
v0.0.1-218570-SNAPSHOT = with sprint boot v1.3.0

Ubuntu 版本

vagrant@account-service-ubuntu:~$ cat /etc/issue
Ubuntu 14.04.3 LTS \n \l

Java 版本

vagrant@account-service-ubuntu:~$ which java
/opt/java/oracle/jdk1.8.0_60/bin/java

自定义启动脚本的服务版本和conf文件-

vagrant@account-service-ubuntu:~$ ls -rtl /var/account-service/
total 64308
-rwxr-xr-x 1 account-service account-service 32941156 Jan  4 11:48 account-service-0.0.1-218655-SNAPSHOT.jar
-rwxr-xr-x 1 account-service account-service      304 Jan  4 11:48 account-service-0.0.1-218655-SNAPSHOT.conf
-rwxr-x--- 1 account-service account-service 32895698 Jan  4 12:09 account-service-0.0.1-218570-SNAPSHOT.jar
-rwxr-x--- 1 account-service account-service      304 Jan  4 12:09 account-service-0.0.1-218570-SNAPSHOT.conf

跨应用版本的Spring boot版本-

vagrant@account-service-ubuntu:~$ sudo /opt/java/oracle/jdk1.8.0_60/bin/jar tf /var/account-service/account-service-0.0.1-218570-SNAPSHOT.jar | grep "spring-boot-1"
lib/spring-boot-1.3.0.RELEASE.jar
vagrant@account-service-ubuntu:~$ sudo /opt/java/oracle/jdk1.8.0_60/bin/jar tf /var/account-service/account-service-0.0.1-218655-SNAPSHOT.jar | grep "spring-boot-1"
lib/spring-boot-1.3.1.RELEASE.jar

只是为了澄清启动自定义conf文件之间没有区别-

vagrant@account-service-ubuntu:~$ sudo diff /var/account-service/account-service-0.0.1-218570-SNAPSHOT.conf /var/account-service/account-service-0.0.1-218655-SNAPSHOT.conf -s
Files /var/account-service/account-service-0.0.1-218570-SNAPSHOT.conf and /var/account-service/account-service-0.0.1-218655-SNAPSHOT.conf are identical

每个 conf 文件都有以下环境变量 -

vagrant@account-service-ubuntu:~$ cat /var/account-service/account-service-0.0.1-218655-SNAPSHOT.conf 
JAVA_HOME=/opt/java/oracle/jdk1.8.0_60
JAVA_OPTS="-Xms256m -Xmx256m -XX:MaxMetaspaceSize=128m -XX:HeapDumpPath=/var/account-service/ -Xloggc:/var/account-service/gc.log"
RUN_ARGS="--server.tomcat.basedir=/var/account-service/tomcat --spring.profiles.active=dev"

使用使用spring boot v1.3.0的版本启动应用程序,它可以正常启动

vagrant@account-service-ubuntu:~$ ls -rtl /etc/init.d/account-service 
lrwxrwxrwx 1 root root 62 Jan  4 12:09 /etc/init.d/account-service -> /var/account-service/account-service-0.0.1-218570-SNAPSHOT.jar

vagrant@account-service-ubuntu:~$ sudo service account-service start
Started [18293]

vagrant@account-service-ubuntu:~$ ps -ef | grep -i java
account+ 19221     1 96 12:10 ?        00:00:05 /opt/java/oracle/jdk1.8.0_60/bin/java -Dsun.misc.URLClassPath.disableJarChecking=true -Xms256m -Xmx256m -XX:MaxMetaspaceSize=128m -XX:HeapDumpPath=/var/account-service/ -Xloggc:/var/account-service/gc.log -jar /var/account-service/account-service-0.0.1-218570-SNAPSHOT.jar --server.tomcat.basedir=/var/account-service/tomcat --spring.profiles.active=dev

vagrant@account-service-ubuntu:~$ curl http://localhost:8081/account/manage/info
{"build":{"artifact":"account-service","name":"Account Service","version":"0.0.1-218570-SNAPSHOT"}}

现在,将符号链接更新为使用 spring boot v1.3.1 的应用版本

vagrant@account-service-ubuntu:~$ sudo service account-service stop
Stopped [19221]

vagrant@account-service-ubuntu:~$ sudo ln -f -s /var/account-service/account-service-0.0.1-218655-SNAPSHOT.jar /etc/init.d/account-service

vagrant@account-service-ubuntu:~$ ls -rtl /etc/init.d/account-service 
lrwxrwxrwx 1 root root 62 Jan  4 12:17 /etc/init.d/account-service -> /var/account-service/account-service-0.0.1-218655-SNAPSHOT.jar

vagrant@account-service-ubuntu:~$ sudo service account-service start
Started [19631]

Shell 报告服务已启动,但没有进程在运行,查看控制台日志失败并出现以下 JVM 错误 -

vagrant@account-service-ubuntu:~$ cat /var/log/account-service-console.log 
Invalid initial heap size: -Xms256m -Xmx256m -XX:MaxMetaspaceSize=128m -XX:HeapDumpPath=/var/account-service/ -Xloggc:/var/account-service/gc.log
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.

如果我直接绕过 init 脚本启动应用程序并传递与启动自定义 conf 文件中定义的相同的环境变量,它可以正常启动

vagrant@account-service-ubuntu:~$ sudo /opt/java/oracle/jdk1.8.0_60/bin/java -Dsun.misc.URLClassPath.disableJarChecking=true -Xms256m -Xmx256m -XX:MaxMetaspaceSize=128m -XX:HeapDumpPath=/var/account-service/ -Xloggc:/var/account-service/gc.log -jar /var/account-service/account-service-0.0.1-218655-SNAPSHOT.jar --server.tomcat.basedir=/var/account-service/tomcat --spring.profiles.active=dev

vagrant@account-service-ubuntu:~$ curl http://localhost:8081/manage/info
{"build":{"artifact":"account-service","name":"Account Service","version":"0.0.1-218655-SNAPSHOT"}}

还有人看到这个吗?我找不到任何关于堆栈溢出讨论的问题。我什至尝试在 github 上区分 spring boot v1.3.0 和 v1.3.1 标签,但没有发现任何明显的东西。

【问题讨论】:

  • 在 1.3.1 中有几个回归,我们已经意识到了这个问题。我在#4872 中添加了指向该主题的链接。请留意更新。

标签: spring-boot


【解决方案1】:

感谢@StéphaneNic​​oll 提供更新。令人遗憾的是,它修复了管理上下文,但引入了 init 脚本错误。如果提到这些错误会帮助我,因为它会为我节省很多精力。

我能够提取初始化脚本并在版本之间执行差异,它可能是这一行 -

command="$javaexe -Dsun.misc.URLClassPath.disableJarChecking=true $JAVA_OPTS -jar $jarfile $RUN_ARGS $*"

在 v1.3.0 版本中是 -

command="$javaexe -Dsun.misc.URLClassPath.disableJarChecking=true $JAVA_OPTS -jar $jarfile $RUN_ARGS $@"

注意 $* 与 $@。我不是 shell/bash 专家,但我认为这可能是基于 - http://tldp.org/LDP/abs/html/internalvariables.html#IFSEMPTY

的原因

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-16
    • 2019-05-30
    • 1970-01-01
    • 2020-07-25
    • 1970-01-01
    • 2014-08-17
    相关资源
    最近更新 更多