我们发现在调用我们在NoSuchMethodError
中调用keySet()
方法的lib方法时抛出ConcurrentHashMap
的问题:
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"
}
}
根据https://docs.gradle.org/current/userguide/java_plugin.html,字节代码应该在Java版本7中生成。
为什么还会出现此问题。
如果我添加
compileJava.options.bootClasspath = "$System.env.JAVA_HOME_7/jre/lib/rt.jar"
使用java7编译器,问题就解决了。
问题:
然后targetCompatibility
的实际用途是什么,如果它实际上并不兼容。
但是我们已经在我们的开发环境中安装了jdk7。对此有完美的解决方案吗?
答案 0 :(得分:0)
请尝试将项目作为参数传递到 allprojects 关闭,如下例所示,因为默认项目是对当前 build.gradle file,如果我们传递一个参数,它将是将应用配置的项目的具体实例:
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
}
}