JAVA项目部署

400 阅读2分钟

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