创建可执行文件JAR中运到的坑

589 阅读1分钟

在Intellij上调试好之后,需要生成相应的可以用于本地直接运行的Jar包并且正确的从命令行中运行。

用mvn生成JAR包

在通过 mvn clean install运行之后发现target文件夹中没有生成相应的JAR文件,发下pom文件中缺少了如下依赖:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-jar-plugin</artifactId>
  <version>3.1.0</version>
  <configuration>
    <archive>
      <manifest>
        <addClasspath>true</addClasspath>
        <classpathPrefix>lib/</classpathPrefix>
        <mainClass>com.license.photo.App</mainClass>
      </manifest>
    </archive>
  </configuration>
</plugin>

直接用java -jar demo-1.0-SNAPSHOT.jar无法运行。报错EError: Unable to initialize main class com.license.photo.App Caused by: java.lang.NoClassDefFoundError: org/opencv/core/CvException

在上一步中可以看出我已经在创建JAR包的时候声明了main函数,本以为是运行过程中没有找到main函数入口,但仔细看后面Caused by: java.lang.NoClassDefFoundError: org/opencv/core/CvException发现是因为有依赖在classpath中没有找到导致main函数无法完成初始化。这里无法找到的CvException很明显是opencv包中的相关依赖。因此这里需要加入之前下载的opencv的JAR包,这个包在Mac中安装后的默认路径为: /usr/local/Cellar/opencv/4.5.3_2/share/java/opencv4/opencv-453.jar将其加入classpath中

再次尝试用java -cp ./demo-1.0-SNAPSHOT.jar:/usr/local/Cellar/opencv/4.5.3_2/share/java/opencv4/opencv-453.jar com.license.photo.App运行,再次报错Exception in thread "main" java.lang.UnsatisfiedLinkError: no opencv_java453 in java.library.path.这里显示上面的问题应该已经解决了,现在报错提醒表示还有lib文件没有放到java.library.path中,导致link失败。故再次尝试java -cp ./demo-1.0-SNAPSHOT.jar:/usr/local/Cellar/opencv/4.5.3_2/share/java/opencv4/opencv-453.jar com.license.photo.App,运行成功。