运行springboot项目
从
springboot的2.5.5版本开始就支持了jdk17
运行命令
java -jar app.jar # 运行java项目
-
使项目在后台运行
nohup java -jar app.jar &,关闭窗口也不会停止运行,设置日志在app.jar后面加上>xx.log -
指定项目运行端口
java -jar app.jar --server.port=xxx -
jps查看运行中java进程,kill -9 pid杀死进程
如果使用nohup命令出现如下信息:
nohup: ignoring input and redirecting stderr to stdout
查看端口是否被占用
在日志输出后面加上
2>&1,例:nohup java -jar ****.jar >log.log 2>&1 &
linux中部署的问题
常用命令
netstat -tunlp | grep 8082查看端口进程号,kill -9 pid杀死指定的进程
java运行版本不同
其中字节码版本52是jdk8,版本61是jdk17的字节码版本
Exception in thread "main" java.lang.UnsupportedClassVersionError: com/example/portablefortheelderlybackground/PortableForTheElderlyBackgroundApplication has been compiled by a more recent version of the Java Runtime
升级
linux运行的jdk环境,或者降低编译文件的jdk版本
java -jar运行找不到启动类
no main manifest attribute
排查方法,找到对应jar包,解压,按照如下顺序找到如下文件夹
META-INF->MANIFEST.MF,用记事本打开它不正常的:
Manifest-Version: 1.0 Implementation-Title:test ........ //没有启动类正常的是这样的:
Manifest-Version: 1.0 Archiver-Version: Plexus Archiver Created-By: Apache Maven 3.8.5 Built-By: 86187 Build-Jdk: 17.0.2 Main-Class: org.springframework.boot.loader.JarLauncher Start-Class: com.example.qiniuserver.QiniuServerApplication //启动类 Spring-Boot-Version: 2.6.13 Spring-Boot-Classes: BOOT-INF/classes/ Spring-Boot-Lib: BOOT-INF/lib/ //依赖目录 Spring-Boot-Classpath-Index: BOOT-INF/classpath.idx Spring-Boot-Layers-Index: BOOT-INF/layers.idx
查看
pom.xml的打包方式是否为jar,不过一般都不会改成war包吧<packaging>jar</packaging>查看
pom.xml插件配置中是否配置了如下了插件<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>${spring-boot.version}</version> <configuration> <mainClass>启动类路径</mainClass> </configuration> <executions> <execution> <id>repackage</id> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin>如果还是无法启动,请注意在
<configuration/>标签中是否含有如下标签,该标签如果为true,会跳过主类的配置<configuration> <mainClass>启动类路径</mainClass> <!-- 是否含有skip标签, --> <skip>true</skip> </configuration>
在项目部署时出现如下错误
java.lang.reflect.InaccessibleObjectException: Unable to make private native … accessible。错误的原因是因为
JVM的模块java.base没有对未命名的模块开放java.lang这个包的深度反射API的调用权限。 具体来说,是没有开放setAccessible(true) API。是
jdk版本的关系,我用的jdk17编译jdk8的项目参考博客:
解决方案
在项目启动阶段添加
VM参数
java -Dsun.misc.URLClassPath.disableJarChecking=true --add-opens jdk.naming.rmi/com.sun.jndi.rmi.registry=ALL-UNNAMED --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/sun.security.action=ALL-UNNAMED --add-opens java.base/sun.net=ALL-UNNAMED --add-opens java.base/java.lang.reflect=ALL-UNNAMED -jar system-1.0.1-SNAPSHOT.jar