我正在使用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错误,请检查您的安装和 再次尝试线程“main”中的异常java.lang.NoClassDefFoundError: COM / tomatechines / instagramapi /服务/异常/ InstagramException
打印完JVM堆栈跟踪后,程序崩溃。
我已经三次检查过包含com/tomatechines/instagramapi/services/exception/InstagramException
的jar是否存在于类路径中,并且还存在于Ubuntu机器的libraries文件夹中。但错误不断发生。
我还检查了罐子名称中可能出现的任何特殊字符,但我什么都没找到。
堆栈跟踪没有对错误的任何进一步解释:
错误:发生了JNI错误,请检查您的安装和 再试一次
有没有人知道我应该检查什么或者应该检查什么来识别问题?
============== UPDATE ============
我使用的所有库都是罐子。没有DLL或OS特定文件。
我试图通过Eclipse导出一个可运行的jar文件并将所有库打包在一个jar(58MB)中,它在Ubuntu上正常工作......我不想使用这个方法因为我的代码会改变很多,我使用的库没有,但如果我把所有内容都装在一个jar中,每次修复一个小bug时,我都需要重新同步58MB,尽管Eclipse进程导出jar的过程非常不方便。
答案 0 :(得分: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>
答案 1 :(得分:1)
我解决了这个问题,实际上我无法理解为什么会解决这个问题,但我却厌倦了尝试理解......
如果我在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文件。 这个罐子的清单看起来像:
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
它试图在我的项目中查找libs的存储库结构,但是,copy dependencies插件只是创建一个文件夹(依赖项)并将所有jar放入其中。所以清单会查找一个从未存在过的文件夹结构,这个jar不会在windows或ubuntu上运行。
解决方案是删除<version>
并添加
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
正如@asettouf所建议的那样。现在我已经回复了这个大警告,但罐子在这两个平台上工作得很好......我真的不关心它在工作时的警告