我如何知道哪个版本的Java编译器被用来构建一个jar?我有一个jar文件,它可以构建在三个jdk中的任何一个中。我们需要确切知道是哪一个,这样我们才能证明兼容性。编译器版本是否嵌入到类文件或jar中?
当前回答
根据@David J. Liszewski的回答,我运行以下命令在Ubuntu上提取jar文件的清单:
# Determine the manifest file name:
$ jar tf LuceneSearch.jar | grep -i manifest
META-INF/MANIFEST.MF
# Extract the file:
$ sudo jar xf LuceneSearch.jar META-INF/MANIFEST.MF
# Print the file's contents:
$ more META-INF/MANIFEST.MF
Manifest-Version: 1.0
Ant-Version: Apache Ant 1.8.2
Created-By: 1.7.0_25-b30 (Oracle Corporation)
Main-Class: org.wikimedia.lsearch.config.StartupManager
其他回答
Java编译器(javac)不构建jar,它将Java文件转换为类文件。Jar工具(Jar)创建实际的Jar。如果没有指定自定义清单,默认清单将指定使用哪个版本的JDK来创建jar。
一行程序(Linux)
解压-p mylib.jar META-INF/MANIFEST. jar曼氏金融
这将打印MANIFEST的内容。MF文件转换为stdout(希望你的jar文件中有一个:)
根据构建包的方式,您将在“Created-By”或“Build-Jdk”键中找到JDK版本。
您可以通过检查前8个字节(或使用可以的应用程序)来判断Java二进制版本。
据我所知,编译器本身并没有插入任何标识签名。无论如何,我不能在文件VM规范类格式中发现这样的东西。
下面是Java查找这些信息的方法。
Windows: javap -v <class> | findstr major Unix: javap -v <class> | grep major
例如: > javap -v应用程序| findstr major 主要版本:51
Owen发布的代码可以告诉你一些其他答案中提到的信息:
public void simpleExample ()
{
FileInputStream fis = new FileInputStream ("mytest.class");
parseJavaClassFile ( fis );
}
protected void parseJavaClassFile ( InputStream classByteStream ) throws Exception
{
DataInputStream dataInputStream = new DataInputStream ( classByteStream );
magicNumber = dataInputStream.readInt();
if ( magicNumber == 0xCAFEBABE )
{
int minorVer = dataInputStream.readUnsignedShort();
int majorVer = dataInputStream.readUnsignedShort();
// do something here with major & minor numbers
}
}
也可以看看这个和这个网站。最后,我迅速修改了Mind Products代码,以检查我的每个依赖项是为了什么而编译的。
推荐文章
- 在流中使用Java 8 foreach循环移动到下一项
- 访问限制:'Application'类型不是API(必需库rt.jar的限制)
- 用Java计算两个日期之间的天数
- 如何配置slf4j-simple
- 在Jar文件中运行类
- 带参数的可运行?
- 我如何得到一个字符串的前n个字符而不检查大小或出界?
- 我可以在Java中设置enum起始值吗?
- Java中的回调函数
- c#和Java中的泛型有什么不同?和模板在c++ ?
- 在Java中,流相对于循环的优势是什么?
- Jersey在未找到InjectionManagerFactory时停止工作
- 在Java流是peek真的只是调试?
- Recyclerview不调用onCreateViewHolder
- 将JSON字符串转换为HashMap