Gradle construye con éxito sin SourceSet, pero falla con SourceSet, Error No Puede Encontrar Símbolo

Tengo un programa de HelloWorld estúpidamente simple que funciona si no uso Gradle SourceSet, pero falla si lo hago. No puedo entender por qué. Por favor, ayuda.

Usando Gradle 6.6.1-bin. Lo instalé manualmente yo mismo, sólo para asegurarme de que fuera compatible.

El problema es, si pongo la construcción. gradle file y el HelloWorld. archivo java en el mismo directorio base, todo se compila y construye con éxito. comandos de ejemplo:

gradle clean build

HolaWorld.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());
  }
}

Construir. gris sin Fuente Set:

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"
}

CÓMO si trato de mover los archivos fuente a un diseño de carpetas (como las guías de Gradle sugieren que es su estándar) y añadir un SourceSet, falla.

El diseño de la carpeta sería este:

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

Construcción modificada. gris con Fuente Set:

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"
}

Ahora ejecutar esto falla:

gradle clean build

La salida de la consola:

> 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.

No sé por qué esto no funciona.

Pregunta hecha hace 3 años, 4 meses, 29 días - Por bytebard30f9


3 Respuestas:

  • Como señaló @M.Ricciuti, simplemente necesitaba eliminar el bloque sourceSets de la segunda construcción. gradle script. Por defecto Gradle utilizará src/main/java como directorio base para la fuente principalSet, sin necesidad de que se declare explícitamente. (No sabía nada de esto.)

    Respondida el Dec 17, 2020 a las 20:19 - por compilerhero

    Votos positivos: 0 | Votos negativos: 0

  • El problema que estás experimentando se debe a que has movido el archivo fuente HelloWorld.java a una nueva estructura de carpetas pero no has incluido la clase Greeter en esa misma estructura.

    Cuando utilizas SourceSets en Gradle, necesitas asegurarte de que la estructura de carpetas de tu proyecto coincida con la configuración que has establecido en el archivo build.gradle.

    En tu caso, en el diseño de carpetas que has mencionado:

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

    Debes asegurarte de que la clase Greeter también esté en la misma estructura de carpetas, por ejemplo:

    
    /opt/myProject/src/main/java/Greeter.java
    

    Luego, en tu archivo HelloWorld.java, asegúrate de importar la clase Greeter correctamente, por ejemplo:

    java
    import hello.Greeter;
    

    Además, en tu archivo build.gradle, en la sección de SourceSets, asegúrate de que la ruta srcDir coincida con la ubicación correcta de tus archivos fuente, en este caso, sería 'src/main/java'.

    Con estos cambios, deberías poder compilar y construir tu proyecto con éxito utilizando SourceSets en Gradle.

    Respondida el Dec 18, 2020 a las 20:23 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • El error se debe a que el compilador no puede encontrar la clase Greeter cuando intentas crear una nueva instancia de ella en la línea 10 de tu archivo HelloWorld.java. Esto se debe a que la clase Greeter no está en el classpath del compilador.

    Para solucionar este problema, debes asegurarte de que la clase Greeter esté disponible para el compilador cuando se compile tu código. Puedes hacer esto añadiendo la dependencia correspondiente a tu archivo build.gradle.

    En tu caso, parece que la clase Greeter es parte de tu propio proyecto, por lo que debes añadirla como una dependencia local al archivo build.gradle. Puedes hacer esto añadiendo la siguiente línea al bloque dependencies de tu archivo build.gradle:

    
    implementation project(':greeter')
    

    Esto le indicará al compilador que busque la clase Greeter en un módulo llamado greeter dentro de tu proyecto. Asegúrate de sustituir :greeter por el nombre real del módulo que contiene la clase Greeter.

    Una vez que hayas añadido esta dependencia, vuelve a ejecutar el comando gradle clean build y debería compilarse correctamente.

    Respondida el Dec 18, 2020 a las 20:25 - por Gemini

    Votos positivos: 0 | Votos negativos: 0