我如何确定一个JAR包是在64位还是32位系统上编译的?

17

我有一个jar文件,但不知道它是64位系统的.jar文件还是32位系统的。如何找到这个信息?

编辑:我的.jar文件具有本地库依赖项。


6
你认为这会有所区别吗?除非.jar文件中有本地代码,否则就无关紧要。 - tehlexx
我认为Jar文件不会有32/64位的特定限制。 - Ravindra Gullapalli
3
如果这真的有所不同,那基本上就毁掉了Java虚拟机的意义;系统独立性。 - Richard Tingle
@tehlexx,我正在使用一个.jar文件,它依赖于两个本地的.so库。 - Zhenya
8
您需要解压 *.so 文件并使用 file 命令检查其位数。JAR 文件中没有其他关于位数的信息。 - Peter Lawrey
6
标题询问存储在瓶子中编译系统的问题(正如评论和答案所指出的那样,这应该是无关紧要的),而问题(在您的评论中澄清)讨论存储在瓶子中的本机二进制文件。这是一个非常大的区别。此外,就像32位和32位可能不同一样,64位和64位也可能不同。听起来你对本机二进制文件的架构和ABI感兴趣(例如Linux x86-64,OpenBSD i386,FreeBSD sparc64,Windows 64位类x86等),而不仅仅是位数本身。 - user
3个回答

40

Java字节码就是Java字节码,无论使用32位还是64位JDK构建,都没有办法确定。

我认为使用32位或64位编译JAR包并没有什么区别。它应该是机器无关的,除非您有一些本地库依赖项或Java代码直接编译为本机代码。


这正是我的情况:我有本地库依赖。 - Zhenya
在这种情况下,我建议每个32位jar和64位jar应该与相应版本的本地库捆绑在一起,然后根据执行机器的JRE版本,程序应该引用正确的本地库。 - Gyanendra Dwivedi
2
据我所知,除非本地库被捆绑在JAR文件中,否则这并没有太大的区别。请参考LWJGL,本地库是在运行时加载的。 - Alvin Wong
1
@Ievgen 你应该在你的问题中包含这样重要的细节。 - Uooo
@Uooo 谁没有本地依赖? - bvdb

16

一个纯净的 Jar 包没有针对特定的架构进行编译。

32 位 JVM 将以 32 位运行该 Jar 包,同样,64 位 JVM 将以 64 位运行该 Jar 包。

当然,如果你的 Jar 包使用本地库,那么这些'位数'必须与你用来运行 Jar 包的 JVM 相匹配。


0

这就是JVM和平台无关性的美妙之处。当涉及到Java、JVM、Jar等时,32位或64位没有任何价值。


这不正确。正如其他人所提到的,字节码没有区别。但在JVM中有差异。64位架构对于相同的数据结构使用更多的内存。这可能导致更长的GC暂停,影响应用程序的延迟等等... - Adrian B.
一个JAR文件不是32位或64位,它可以在任何JVM上运行。然而,本地共享库只能是32位或64位,并且只能与具有相同位数的JVM一起运行。这是应用程序在Windows和Linux(以及其他所有操作系统AFAIK)上运行的限制。无法在32位JVM上加载64位库,反之亦然。您需要将共享库版本与JVM匹配。 - Rameez
据我所知,这并不是所有系统的限制,有些系统可以将不同CPU的代码捆绑成一个单一的二进制文件。 - josefx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接