Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 尽管targetCompatibility已经是1.7,但jdk8编译器存在jdk版本兼容性问题_Java_Gradle - Fatal编程技术网

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有什么意义?仅检查方法或类是否存在?