背景: 一个java应用,需要再centos上运行,思路是通过脚本来启动,
首先需要将java应用打成jar包,方式是通过maven来操作,然后编译报错
排查配置:
-
File ->Setting -> Build,Execution,Deployment ->Compiler->Java Compiler
Project bytecode version ,Per-Module bytecode version
最好跟本机安装的保持一致,这边 都写成8
image-20210113135400798.png -
File ->Project Structure ->Project Setting -> Project
Project SDK, Project language level
需要跟本机安装的保持一致,这边 都写成8
image-20210113140242628.png -
编译时候,发现 问题1 处的 bytecode version经常会改变,这时候需要排查下pom.xml文件,如下图中的source,target需要写成对应的,这边之前一直没注意,写的都是1.5/1.6,编译时候总是提示 ‘java: -source 1.6 中不支持’
image-20210113142138416.png -
运行jar包的时候,
1 .提示ClassNotFoundException, 这个class 是第三方的jar包中的类,排查了下了对应路径下没有jar包,直接复制到jar包目录下,我这是lib,新的脚本命令是java -cp lib/ -jar 目标.jar
-
提示xxx 中没有主清单属性 ,需要在pom.xml文件中 配置 <mainClass>标签指定对应的启动类即可
image-20210113145414036.png
- 这边有kotlin写的类,直接用idea自带的maven package脚本不行,需要加上 kotlin:compile
clean+package的命令是mvn clean kotlin:compile package -Dmaven.test.skip=true
,
有kotlin文件,编译的速度会慢了一点,klass ->class ?
- 生成的jar包 包含依赖的第三方jar包
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<appendAssemblyId>false</appendAssemblyId>
<classifier></classifier>
<archive>
<manifest>
<mainClass>包名+启动类名</mainClass>
</manifest>
<manifestEntries>
<Class-Path>.</Class-Path>
</manifestEntries>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-assembly</id> <!-- this is used for inheritance merges -->
<phase>package</phase> <!-- 指定在打包节点执行jar包合并操作 -->
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
我这边遇到一个问题,因为使用的第三方jar包是本地生成的,在生成的可执行jar包中调用总是提示classNotFoundExcetion...
排查了下,生成的jar包中,没有本地第三方的jar包类文件,其他引用到的第三方仓库类都有,于是把引用的本地第三方jar包放在本地仓库,pom文件中dependency下,问题解决。
引用的本地第三方jar包放在本地仓库的命令格式:
mvn install:install-file -Dfile=本地第三方包名.jar -DgroupId=com.aa.bb -DartifactId=hello -Dversion=1.0 -Dpackaging=jar
我是通过把本地jar包放到本地仓库下解决了这个问题。
网友评论