有没有一种方法可以专门检测使用哪个JDK来编译给定的JAR /类文件?
我不是不是要求Java version(1.4、1.6、1.8 ...)。
我要问的是是否用OpenJDK或其他一些JDK。他们在某处留下某种“供应商标签”吗?
答案 0 :(得分:1)
首先回答问题: 默认情况下,据我所知,不,它没有留下使用哪个JDK编译jar / class文件的指示
话虽如此...
如果您使用以下构建工具,则 可以 修改/添加到自己的已编译jar的清单文件中,并包括自己的属性(在本例中为您使用的JDK)作为Maven。
这里有一些入门链接,概述了使用Maven Jar插件向清单文件添加属性和值的过程,我已将帖子复制/粘贴为我认为的引用文本(只是一种意见) )将是最容易理解/使用的: Using the Apache Maven Jar Plugin
在事后看来,答案是显而易见的。 Spring-Boot的maven插件重写了原始清单文件,因此使用maven jar 插件清单可以正常编写。像这样:
org.springframework.boot spring-boot-maven-plugin
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <configuration> <archive> <manifestEntries> <splashscreen-image>${image.name}</splashscreen-image> </manifestEntries> </archive> </configuration> </plugin> </plugins> </build>
这里还有一些指向Apache文档和站点的链接,这些链接涵盖了类似的内容,但可能会提供更多细节。
Link To Apache's Documentation example/explanation of Manifest Entries
Link To Apache's "cookbook" for adding build time to the manifest
希望这会有所帮助!
答案 1 :(得分:1)
原则上,编译器可以将有关自身的信息保留在类文件中,因为类文件是可扩展的容器,是根据命名属性构建的。
但是,类文件格式为well documented,并且有独立的开源库和工具(例如ASM,BCEL或Javassist),可用于检查已编译的类文件及其属性,以找出,像javac
或ecj
这样的通用编译器创建的类文件中不存在此类附加属性。
尽管如此,生成的代码还是有一些差异,例如由javac
或ecj
编写,可以找出使用了哪些编译器。例如,this answer讨论了javac
为“尝试资源”语句生成的代码,该代码与ecj
生成的代码有显着差异。
但是,您不能仅仅因为OpenJDK和Oracle的商业JDK是同一编译器就将javac
分开。我只是通过比较由OpenJDK和Oracle的JDK生成的已编译的重要类文件的树来验证这一点。没什么区别。
这两个JDK之间的区别是监视和性能分析工具。当然,您无法确定是否在应用程序开发期间使用了这些工具,但这无所谓,因为Oracle的许可允许使用其JDK进行开发。在生产环境中使用这些管理工具应该会产生成本。
答案 2 :(得分:0)
默认清单文件包含构建信息。 https://docs.oracle.com/javase/tutorial/deployment/jar/defman.html
META-INF / MANIFEST.MF
清单版本:1.0
JDK版本和供应商
创建时间:1.7.0_06(Oracle公司)