当前位置: 首页 > 面试题库 >

Gradle sourceCompatibility对子项目无效

杜骏祥
2023-03-14
问题内容

我的机器上安装了Java 6和7。Gradle使用1.7(使用选中gradle -v)。但是我需要编译代码以与Java
1.6兼容。据我了解的文档,我可以使用sourceCompatibility属性来实现(并间接使用targetCompatibility,默认为
sourceCompatibility)。

因此,我将以下行添加到了我的构建文件中(在根级别,而不是在任何闭包中):

sourceCompatibility = 1.6

(确保targetCompatibility = 1.6在某些试验中我也添加了,但这应该没有什么不同)

为了检查结果是否实际上与1.6兼容,我将产生的jar解压缩cdWEB-INF/classes文件夹中,并javap -verbose.class遇到的第一个文件上使用。但是,无论我设置目标兼容性还是使用1.5而不是1.6还是将其指定为字符串('1.6'),每次javap的结果都是

minor version: 0
major version: 51

Afaik这意味着它是Java 1.7字节码,这是错误的。

有什么想法为什么sourceCompatibility设置无效?还是javap检查兼容性的正确方法?

更新:
是的,这实际上是一个多项目的构建,但是我只检查了一个子项目的构建结果。在此子项目的构建文件中,我进行了提及的更改,以确保它们确实被应用。另外,我在根项目的构建文件中添加了以下内容(也建议使用@Vidya):

allprojects {
    sourceCompatibility = 1.6
    targetCompatibility = 1.6
}

但这也无济于事。

更新2: 我在相关的build.gradle文件中使用此代码段检查了sourceCompatibility的设置:

compileJava.doFirst {
    println "source compatibility " + sourceCompatibility
}

它显示了我的sourceCompatibility设置为1.7,尽管我尝试将其设置为1.6。当我提取最简单的子项目并独立构建时,sourceCompatibility设置正确,并且Java
Byte代码与1.6兼容。但是,即使在多项目构建中使用时,即使该子项目也使用了错误的sourceCompatibility。

BTW:我在一些子项目使用的插件是:javawarjettygwt

更新3:
我改变了内置的脚本只使用了Java插件(因此只建造了一些罐子),除去的使用warjettygwt插件。但是尽管我在本allprojects节和某些子项目中进行了设置,但仍将所有项目都设置为sourceCompatibility
1.7
。现在,构建脚本中只剩下一些声明(Maven,文件和其他子项目),要使用的存储库的声明,其他一些任务的声明(构建任务不依赖于,因此不应该受到影响)以及为所创建的jar文件配置清单文件的方式(我向清单文件添加了规范,实现版本和标题)。

我看不到有什么会影响sourceCompatibility设置。


问题答案:

似乎此行为是由指定sourceCompatibility before 引起的apply plugin: 'java',如果尝试在其中设置兼容性选项,则会发生这种情况allprojects

在我的设置中,可以通过以下方法解决此问题:

allprojects {
    sourceCompatibility = 1.6
    targetCompatibility = 1.6
}

与:

allprojects {
    apply plugin: 'java'
    sourceCompatibility = 1.6
    targetCompatibility = 1.6
}

如果其他人可以在其他设置中对此进行验证,我们将非常高兴。

我仍然不确定是否应该将其报告为错误,但我相信此解决方案比上述解决方法更好(但是,它非常有帮助)。



 类似资料:
  • 我正在使用sbt 0.13.12,这是我的项目 在构建中。sbt取决于公共。如果我按sbt project sub1 run运行就可以了。但是,当我将子项目打包为jar文件时,我运行sub1。jar文件中,错误显示sub1无法找到一类公共的。 我的目的是包装sub1。jar和sub2。在每个jar文件中编译带有通用代码的jar。 --更新-- 我尝试作为建议回答。运行时遇到这个问题: 而且,是的!

  • sbt子项目是否可以有自己的目录?或者只有根项目可以用。Scala帮助器文件为构建项目的目录?。下面是我目前的建筑结构。无法访问中定义的对象。 更新:sub-project-1/build.sbt中的以下sbt定义 由于以下错误而失败 Common在/my-project/projects/Common.scala中定义,没有问题。但是Localhost是在/my-project/sub-proj

  • 配置子项目 到目前为止你已经把ToDo项目根据功能拆分成多个模块,接下来可以用之前的方法来定义构建逻辑,下面有几点需要主要: 根目录和子目录使用相同的group和version属性值 所有的子目录都是Java项目需要Java插件来正常工作,所以你只需要在子项目中应用Java插件 web子项目是唯一一个依赖外部库的项目,它需要打包成WAR而不是JAR 子项目之间可以定义模块依赖 接下来你将学习如何定

  • 我有项目A和项目B,A通过composer依赖于B。B实现A中接口的功能。 我在B中有正确执行的单元测试。现在,我想通过API测试这一点——为此,我使用项目A并通过HTTP API测试所有功能。 给定项目A,拥有自己的docker compose。yml与其他开发人员共享,我无法更改此配置。 我在项目A中有更多类似B的项目。此外,我也有更多类似A的项目,它们大多与项目A具有类似的共享依赖关系。 为

  • 我有以下结构: api和web项目都使用插件,但其他项目只有插件。 我想在根项目中为heroku定义一个任务,即: 对所有拥有它的子项目执行干净任务 对所有拥有它的子项目执行战争任务 在所有拥有它的子项目上执行构建任务 我看到了这个答案:按顺序调用子项目和其他任务但失败的Gradle批处理任务。已尝试以下配置 并获取此错误: (api有war插件,如果我取消对task stage的注释,我可以运行

  • 我将JDK 11与Maven 3.6.2一起安装,并且正在使用容易出错的方式编译我的Javamaven项目。使用此配置: pom。xml: pom。xml: 我收到以下错误: CompilerException:InvocationTargetException:无效目标发布:11 我尝试以下信息:无法使用Maven编译简单的Java10/Java11项目 然而,升级ASM并没有改变任何事情。