【问题标题】:jar runs on Windows but doesn't on Ubuntujar 可以在 Windows 上运行,但不能在 Ubuntu 上运行
【发布时间】:2017-08-09 02:26:08
【问题描述】:

我正在使用 Maven 为我的项目生成一个可运行的 jar 文件,其中包含所有依赖项(复制到单独的文件夹中)。

http://pastebin.com/NfhiVZhM(链接到 pom.xml 以避免在此处复制巨型 xml)

我在装有 jdk 1.8 的 Windows 10 机器上运行 mvn 包。 mvn 运行后,如果我打开 cmd 并运行 java -jar instagramBot.jar 一切正常。

Maven 生成结果(目标)的文件夹由 Dropbox 与装有 oracle-jdk-1.8 的 Ubuntu 机器同步。

但是如果在 Ubuntu 上打开一个 shell 并运行相同的命令,结果是:

rafa@Bangkok:~/svn/instagramBot/target$ java -jar instagramBot.jar 错误:发生 JNI 错误,请检查您的安装并 重试线程“主”java.lang.NoClassDefFoundError 中的异常: com/tomatechines/instagramapi/services/exception/InstagramException

在打印出 JVM 堆栈跟踪后,程序崩溃。

我已经三次检查了包含 com/tomatechines/instagramapi/services/exception/InstagramException 的 jar 是否存在于类路径中,并且也存在于 Ubuntu 机器的库文件夹中。但是错误一直在发生。

我还检查了罐子名称中可能出现的任何特殊字符,但我什么也没找到。

堆栈跟踪对错误没有任何进一步的解释:

错误:发生 JNI 错误,请检查您的安装并 再试一次

有谁知道可能是什么或我应该检查什么来确定问题?

==============更新============

我使用的所有库都是罐子。没有 DLL 或操作系统特定的文件。

我尝试通过 Eclipse 导出一个可运行的 jar 文件并将所有库打包在一个 jar (58MB) 中,它在 Ubuntu 上正常工作...我不想使用这种方法,因为我的代码会改变很多,而我使用的库没有,但是如果我将所有内容打包在一个 jar 中,每次我修复一个小错误时,我都需要重新同步 58MB,尽管事实上 Eclipse 导出 jar 的过程非常不方便。

【问题讨论】:

  • JNI 是 Java 本地接口,它是 Java 与本地库(专门为操作系统编写的库,例如 C 或 C++)对话的方式。您尝试运行的程序是否需要本机库?你在正确的地方有 Linux 的相关库吗? (注意:Windows DLL 不能在 Linux 上运行,您需要特定于 Linux 的库版本)。
  • 不!我使用的所有库都是罐子。现在我尝试通过eclipse导出一个可运行的jar文件并将所有库打包在一个jar(58MB)中,它在ubuntu上正常工作......
  • 错误提示检查您的安装。它可能指的是jvm本身
  • 是多模块项目吗?你用什么命令与maven一起使用?可以显示maven的输出吗?
  • @asettouf,不是多模块,我使用的命令只是 mvn 包(您可以在链接中查看 pom.xml)。 mvn 输出你可以检查pastebin.com/gW4tQuX6 但没有什么特别的

标签: java maven jar java-native-interface compatibility


【解决方案1】:

答案就在这里

[WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources, i.e. build is platform dependent

您可能希望在 pom 中将源编码声明为 utf8,请参阅 this link

<properties>
    ...
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    ...
</properties>

【讨论】:

  • 在 pom 中添加此信息会停止警告但不能解决我的问题,我不断收到错误消息,现在我在 Windows 和 Ubuntu 上运行
  • 实际上不是你的建议使项目停止在 Windows 上工作......是另一个“修复”maven 建议我,我没有检查......现在问题解决了。谢谢你
【解决方案2】:

我解决了这个问题,实际上我不明白为什么它解决了,但我已经厌倦了尝试理解......

如果我在 http://pastebin.com/NfhiVZhM 上使用 pom 运行 mvn 包,我会收到两个警告

[WARNING] 
[WARNING] Some problems were encountered while building the effective model for InstagramBot:InstagramBot:jar:2.0.1
[WARNING] 'build.plugins.plugin.version' for org.apache.maven.plugins:maven-jar-plugin is missing. @ line 26, column 12
[WARNING] 
[WARNING] It is highly recommended to fix these problems because they threaten the stability of your build.
[WARNING] 
[WARNING] For this reason, future Maven versions might no longer support building such malformed projects.

//大量信息输出//

[WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources, i.e. build is platform dependent!

我得到了一个在 Windows 上运行良好的可运行 jar 文件。 这个 jar 的清单如下所示:

Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Built-By: rafael
Class-Path: dependency/utils-1.4.3.jar dependency/commons-io-2.5.jar d
 ependency/slf4j-api-1.7.22.jar dependency/slf4j-log4j12-1.7.22.jar de
 pendency/log4j-1.2.17.jar dependency/hibernate-core-5.1.0.Final.jar d
 ependency/jboss-logging-3.3.0.Final.jar dependency/hibernate-jpa-2.1-
 api-1.0.0.Final.jar dependency/javassist-3.20.0-GA.jar dependency/ant

由于第一个警告太大,我在 pastebin 上发布后解决了这个问题,只需在我的 maven-jar-plugin 中添加以下行(警告中提到的行)

<version>3.0.0</version>

简单地执行此操作,maven 创建的清单更改为:

Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Built-By: rafael
Class-Path: dependency/com/tomatechines/utils/1.4.3/utils-1.4.3.jar de
 pendency/commons-io/commons-io/2.5/commons-io-2.5.jar dependency/org/
 slf4j/slf4j-api/1.7.22/slf4j-api-1.7.22.jar dependency/org/slf4j/slf4
 j-log4j12/1.7.22/slf4j-log4j12-1.7.22.jar dependency/log4j/log4j/1.2.
 17/log4j-1.2.17.jar dependency/org/hibernate/hibernate-core/5.1.0.Fin

它尝试为我的项目中的库查找存储库结构,但是,复制依赖项插件只是创建一个文件夹(依赖项)并将所有 jar 放入其中。所以清单会寻找一个从未存在过的文件夹结构,并且这个 jar 在 windows 和 ubuntu 上都不起作用。

解决方案是删除 &lt;version&gt; 并添加

&lt;project.build.sourceEncoding&gt;UTF-8&lt;/project.build.sourceEncoding&gt;

正如@asettouf 所建议的那样。现在我已经返回了大警告,但是 jar 在两个平台上都可以正常工作......而且我真的不在乎那个警告,而它正在工作

【讨论】:

    猜你喜欢
    • 2015-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-12
    相关资源
    最近更新 更多