Gradle успешно строится без sourceSet, но сбой с sourceSet, ошибка не может найти символ

#java #gradle #build

#java #gradle #сборка

Вопрос:

У меня есть глупо простая программа HelloWorld, которая работает, если я не использую Gradle sourceSet, но терпит неудачу, если я использую. Я не могу понять, почему. Пожалуйста, помогите.

Использование Gradle 6.6.1-bin. Я сам установил его вручную, просто чтобы убедиться, что он совместим.

Проблема в том, что если я помещу файл build.gradle и HelloWorld.java-файл в том же базовом каталоге, все компилируется и строится успешно. Пример команд:

 gradle clean build
 

HelloWorld.java:

 package hello;

import org.joda.time.LocalTime;

public class HelloWorld {
  public static void main(String[] args) {
    LocalTime currentTime = new LocalTime();
    System.out.println("The current local time is: "   currentTime);

    Greeter greeter = new Greeter();
    System.out.println(greeter.sayHello());
  }
}
 

build.gradle без sourceSet:

 apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'application'

mainClassName = 'hello.HelloWorld'

repositories {
    mavenCentral()
}

jar {
    archiveBaseName = 'gs-gradle'
    archiveVersion =  '0.1.0'
}

sourceCompatibility = 1.8
targetCompatibility = 1.8

dependencies {
    implementation "joda-time:joda-time:2.2"
    testImplementation "junit:junit:4.12"
}
 

ОДНАКО, если я попытаюсь переместить исходные файлы в макет папки (как предполагают руководства Gradle, это их стандарт) и добавить sourceSet, произойдет сбой.

Макет папки будет таким:

  • /opt/myProject/src/main/java/HelloWorld.java
  • /opt/MyProject/build.gradle

Модифицированный build.gradle с помощью sourceSet:

 apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'application'


sourceSets {
    main {
        java {
            srcDir 'src'
        }
    }
}

mainClassName = 'hello.HelloWorld'

repositories {
    mavenCentral()
}

jar {
    archiveBaseName = 'gs-gradle'
    archiveVersion =  '0.1.0'
}

sourceCompatibility = 1.8
targetCompatibility = 1.8

dependencies {
    implementation "joda-time:joda-time:2.2"
    testImplementation "junit:junit:4.12"
}
 

Теперь запуск этого завершается с ошибкой:

 gradle clean build
 

Вывод консоли:

 > Task :compileJava FAILED
/opt/myProject/src/main/java/HelloWorld.java:10: error: cannot find symbol
    Greeter greeter = new Greeter();
    ^
  symbol:   class Greeter
  location: class HelloWorld
/opt/myProject/src/main/java/HelloWorld.java:10: error: cannot find symbol
    Greeter greeter = new Greeter();
                          ^
  symbol:   class Greeter
  location: class HelloWorld
2 errors

FAILURE: Build failed with an exception.
 

Я не знаю, почему это не работает.

Комментарии:

1. просто удалите sourceSets блок из вашего второго build.gradle скрипта: по умолчанию Gradle будет использоваться src/main/java в качестве базового каталога для main sourceSet. почему вы пытаетесь принудительно использовать этот каталог src/ (вы уже переместили свой src/main/java исходный файл, как и ожидалось)

2. @M.Ricciuti Спасибо. Я не могу поверить, что это была проблема все время. Я бы хотел, чтобы документация по Gradle и ее примерам была немного лучше!

Ответ №1:

Как указал @M.Ricciuti, мне просто нужно было удалить блок sourceSets из второго скрипта build.gradle. По умолчанию Gradle будет использовать src /main / java в качестве базового каталога для основного исходного набора, без необходимости его явного объявления. (Я не знал об этом.)