programing tip

Gradle sourceCompatibility는 하위 프로젝트에 영향을 미치지 않습니다.

itbloger 2021. 1. 6. 07:49
반응형

Gradle sourceCompatibility는 하위 프로젝트에 영향을 미치지 않습니다.


내 컴퓨터에 Java 6 및 7이 설치되어 있습니다. Gradle은 1.7을 사용합니다 (를 사용하여 확인 gradle -v). 하지만 Java 1.6과 호환되도록 코드를 컴파일해야합니다. 내가 문서를 이해하는 한 sourceCompatibility속성을 사용하여 그렇게 할 수 있습니다 (간접적으로 targetCompatibility기본값이 sourceCompatibility).

그래서 다음 줄을 빌드 파일에 추가했습니다 (클로저가 아닌 루트 수준).

sourceCompatibility = 1.6

(확실히 targetCompatibility = 1.6일부 시도에서 추가 했지만 차이가 없어야 함)

결과가 실제로 1.6과 호환되는지 확인하기 위해 결과 항아리의 압축을 풀고 폴더에 cd넣은 다음 처음 만난 파일 WEB-INF/classes사용 javap -verbose했습니다 .class. 그러나 대상 호환성을 설정했는지 또는 1.6 대신 1.5를 사용했는지 여부 또는 문자열 ( '1.6') 로 지정했는지 여부에 관계없이 javap의 결과가

minor version: 0
major version: 51

Afaik은 이것이 잘못된 Java 1.7 Bytecode임을 의미합니다.

sourceCompatibility-setting이 작동하지 않는 이유는 무엇입니까? 아니면 javap호환성을 확인하는 올바른 방법이 아닙니까?

업데이트 : 예, 이것은 실제로 다중 프로젝트 빌드이지만 하위 프로젝트의 빌드 결과 중 하나만 확인했습니다. 이 하위 프로젝트의 빌드 파일에서 실제로 적용되도록 언급 한 변경 사항을 적용했습니다. 또한 루트 프로젝트의 빌드 파일에 다음을 추가했습니다 (@Vidya도 제안한대로).

allprojects {
    sourceCompatibility = 1.6
    targetCompatibility = 1.6
}

그러나 이것도 도움이되지 않았습니다.

업데이트 2 : 관련 build.gradle 파일에서이 코드 조각으로 sourceCompatibility 설정을 확인했습니다.

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

1.6으로 설정하려고했지만 내 sourceCompatibility가 1.7로 설정된 것으로 나타났습니다. 가장 간단한 하위 프로젝트를 추출하고 자체적으로 빌드하면 sourceCompatibility가 올바르게 설정되고 Java Byte 코드가 1.6과 호환됩니다. 그러나이 하위 프로젝트도 다중 프로젝트 빌드에서 사용될 때 잘못된 sourceCompatibility를 사용합니다.

BTW : 나는 서브 프로젝트의 일부에 사용하는 플러그인은 다음과 같습니다 java, war, jetty,gwt

업데이트 3 : 자바 플러그인을 사용하기 위해 빌드 된 스크립트를 변경하고 (따라서 일부 jar 만 생성) war, jettygwt플러그인 사용을 제거했습니다 . 그러나 allprojects섹션과 일부 하위 프로젝트에서 설정 했음에도 불구하고 모든 프로젝트는 sourceCompatibility 1.7로 설정되어 있습니다. 이제 빌드 스크립트에 남은 것은 일부 품위 (메이븐, 파일 및 기타 하위 프로젝트) 선언, 사용할 저장소 선언, 일부 다른 작업 선언 (빌드 작업이 의존하지 않는, 따라서 영향을받지 않아야합니다.) 생성 된 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
}

다른 사람이 다른 설정에서 이것을 확인할 수 있다면 기뻐할 것입니다.

이 문제가 버그로보고되어야하는지 여부는 아직 확실하지 않지만이 솔루션이 위에서 언급 한 해결 방법보다 낫다고 생각합니다 (그러나 매우 유용했습니다).


누군가가 덮어 쓰고 있다는 증상이 나타납니다 project.sourceCompatibility. 그러나 Gradle을 사용자 정의하는 방법은 여러 가지가 있기 때문에 누구인지 멀리서 말할 수 없습니다.

해결 방법으로 작업 수준에서 속성을 설정할 수 있습니다. 이것이 궁극적으로 중요합니다.

tasks.withType(JavaCompile) { 
    sourceCompatibility = "1.6"
    targetCompatibility = "1.6" 
}

이것을 allProjects { ... }차단에 추가하십시오 .


You need to define compileJava tasks in build.gradle file, if you are using sourceCompatibility or targetCompatibility. Without compileJava tasks, both compatibility variables are displayed as unused variables in Intellij. I am using Gradle version 2.10.

ReferenceURL : https://stackoverflow.com/questions/21028438/gradle-sourcecompatibility-has-no-effect-to-subprojects

반응형