美文网首页
Idea下通过maven生成jar包踩坑记录

Idea下通过maven生成jar包踩坑记录

作者: heheworld | 来源:发表于2021-01-13 14:59 被阅读0次

    背景: 一个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

    1. 提示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包放到本地仓库下解决了这个问题。

    相关文章

      网友评论

          本文标题:Idea下通过maven生成jar包踩坑记录

          本文链接:https://www.haomeiwen.com/subject/pjiuaktx.html