Java 尽管targetCompatibility已经是1.7,但jdk8编译器存在jdk版本兼容性问题
我们发现一个问题,即调用库的方法时抛出Java 尽管targetCompatibility已经是1.7,但jdk8编译器存在jdk版本兼容性问题,java,gradle,Java,Gradle,我们发现一个问题,即调用库的方法时抛出NoSuchMethodError,该方法调用ConcurrentHashMap中的keySet()方法: Exception in thread "Thread-6" java.lang.NoSuchMethodError: java.util.concurrent.ConcurrentHashMap.keySet()Ljava/util/concurrent/ConcurrentHashMap$KeySetView; at cn.webank.w
NoSuchMethodError
,该方法调用ConcurrentHashMap中的keySet()
方法:
Exception in thread "Thread-6" java.lang.NoSuchMethodError: java.util.concurrent.ConcurrentHashMap.keySet()Ljava/util/concurrent/ConcurrentHashMap$KeySetView;
at cn.webank.wemq.client.impl.producer.MessageQueueHealthManager.fetchQueuePermFromNameserver(MessageQueueHealthManager.java:95)
at cn.webank.wemq.client.impl.producer.ProducerFactory.publish(ProducerFactory.java:513)
at cn.webank.wemq.client.impl.producer.ProducerFactory.publish(ProducerFactory.java:493)
at cn.webank.wemq.producer.WeMQProducer.publish(WeMQProducer.java:147)
at cn.webank.rmb.common.WeMQUtil.sendPersistentMsg(WeMQUtil.java:34)
at cn.webank.rmb.core.impl.WeMQAsyncMessagePublisher.publish(WeMQAsyncMessagePublisher.java:50)
at cn.webank.rmb.core.impl.WeMQClientImpl.publish(WeMQClientImpl.java:195)
at cn.webank.rmb.impl.RMBWeMQImpl.publish(RMBWeMQImpl.java:124)
at cn.webank.rmb.api.RMB.publish(RMB.java:97)
at com.webank.multicase.BroadCastModePublisher$1.run(BroadCastModePublisher.java:69)
at java.lang.Thread.run(Thread.java:745)
由于我们使用jdk8作为开发环境,并且考虑了兼容性问题,所以我们将提供jdk7的版本。所以我们已经申报了
sourceCompatibility
和targetCompatibility
与1.7类似
allprojects {
apply plugin: 'java'
clean.doFirst {
delete 'build'
delete 'dist'
}
if (project.findProperty("jdk") == "1.7") {
sourceCompatibility = 1.7
targetCompatibility = 1.7
} else {
sourceCompatibility = 1.8
targetCompatibility = 1.8
version = version + "-jdk8"
}
if (project.findProperty("snapshot") instanceof String) {
if (project.property("snapshot").toBoolean()) version = version + "-SNAPSHOT"
}
}
根据,字节码应该在Java版本7中生成
为什么这个问题仍然存在
如果我加上
compileJava.options.bootClasspath = "$System.env.JAVA_HOME_7/jre/lib/rt.jar"
使用java7编译器,这个问题将得到解决
问题:
那么targetCompatibility
的实际用途是什么呢?如果它实际上没有使其兼容
但这迫使我们在开发环境中安装了jdk7。有一个完美的解决方案吗
请尝试将项目作为参数传递到allprojects闭包中,如下面的示例所示,因为默认情况下,项目是对当前build.gradle文件中的项目的引用,如果我们传递参数,它将是将应用配置的项目的具体实例:
allprojects { prj ->
if (prj.findProperty("jdk") == "1.7") {
prj.sourceCompatibility = 1.7
prj.targetCompatibility = 1.7
} else {
prj.sourceCompatibility = 1.8
prj.targetCompatibility = 1.8
}
}
它设置编译器生成的字节码版本,但不知道该版本中存在哪些类和方法,哪些不存在。请您详细说明,并在回答中提供一些参考。我希望如果目标是1.7,那么所有东西都应该使用1.7。如果不是,那么使用1.7有什么意义?仅检查方法或类是否存在?