我可以检测使用哪个JDK(不是版本!)来编译JAR / .class吗?

时间:2018-10-12 13:13:39

标签: java

有没有一种方法可以专门检测使用哪个JDK来编译给定的JAR /类文件?

我不是不是要求Java version(1.4、1.6、1.8 ...)。

我要问的是是否用OpenJDK或其他一些JDK。他们在某处留下某种“供应商标签”吗?

3 个答案:

答案 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),可用于检查已编译的类文件及其属性,以找出,像javacecj这样的通用编译器创建的类文件中不存在此类附加属性。

尽管如此,生成的代码还是有一些差异,例如由javacecj编写,可以找出使用了哪些编译器。例如,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公司)