虽然targetCompatibility已经是1.7,但jdk版本兼容性问题与jdk8编译器有关

时间:2017-06-02 06:18:28

标签: java gradle

我们发现在调用我们在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的版本。所以我们已经宣布了 sourceCompatibilitytargetCompatibility为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编译器,问题就解决了。

问题:

  1. 然后targetCompatibility的实际用途是什么,如果它实际上并不兼容。

  2. 但是我们已经在我们的开发环境中安装了jdk7。对此有完美的解决方案吗?

1 个答案:

答案 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
    }
}