Estoy corriendo en un problema raro cuando intento para construir mi proyecto a través de Gradle.
La acumulación funciona bien cuando la importación del proyecto en IntelliJ y pruebas de construcción / ejecutar a través de la IDE. Sin embargo, si me quedo ./gradlew test
, la generación falla y es incapaz de resolver los símbolos en el JDK (como GenericArrayType
).
Si delego acciones de construcción / gestión de IntelliJ a Gradle, veo los mismos problemas en mi IDE, así, por lo que algo parece estar al día con mi construcción Gradle, y no puedo averiguar qué. Otros proyectos trabajan muy bien, por lo que parece ser un problema con este proyecto específico.
He intentado esto en máquinas diferentes (uno con Ubuntu y los otros macOS funcionamiento), así como diferentes versiones Gradle ( 4.10.2
, 5.1.1
), pero persiste el problema. He copiado y pegado el código fuente a otro proyecto que ya funciona perfectamente bien, y luego empecé a fallar con los mismos errores, así, cuando me encontré con las pruebas unitarias.
¿Puede alguien ayudarme a averiguar lo que va mal aquí?
Esto es lo que mi settings.gradle
aspecto:
rootProject.name = 'types'
y build.gradle
:
group 'com.vinaysshenoy'
version '1.0.0'
buildscript {
ext.junit_version = '4.12'
ext.assertj_version = '3.11.1'
ext.jsr305_version = '3.0.2'
repositories {
mavenCentral()
}
}
apply plugin: 'java-library'
java {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
repositories {
mavenCentral()
}
dependencies {
implementation "com.google.code.findbugs:jsr305:$jsr305_version"
testImplementation "junit:junit:$junit_version"
testImplementation "org.assertj:assertj-core:$assertj_version"
}
Esto es lo que veo cuando lo ejecuto a través de la línea de comandos:
public static final class GenericArrayTypeImpl implements GenericArrayType {
^
symbol: class GenericArrayType
location: class Util
/Users/vinay/Dev/IdeaProjects/types/src/main/java/com/vinaysshenoy/types/util/Util.java:230: error: cannot find symbol
public static final class ParameterizedTypeImpl implements ParameterizedType {
^
symbol: class ParameterizedType
location: class Util
/Users/vinay/Dev/IdeaProjects/types/src/main/java/com/vinaysshenoy/types/util/Util.java:340: error: cannot find symbol
public static final class WildcardTypeImpl implements WildcardType {
^
symbol: class WildcardType
location: class Util
/Users/vinay/Dev/IdeaProjects/types/src/main/java/com/vinaysshenoy/types/Types.java:54: error: incompatible types: ParameterizedTypeImpl cannot be converted to ParameterizedType
return new ParameterizedTypeImpl(null, rawType, typeArguments);
^
/Users/vinay/Dev/IdeaProjects/types/src/main/java/com/vinaysshenoy/types/Types.java:63: error: incompatible types: ParameterizedTypeImpl cannot be converted to ParameterizedType
return new ParameterizedTypeImpl(ownerType, rawType, typeArguments);
^
/Users/vinay/Dev/IdeaProjects/types/src/main/java/com/vinaysshenoy/types/Types.java:68: error: incompatible types: GenericArrayTypeImpl cannot be converted to GenericArrayType
return new GenericArrayTypeImpl(componentType);
^
/Users/vinay/Dev/IdeaProjects/types/src/main/java/com/vinaysshenoy/types/Types.java:78: error: incompatible types: WildcardTypeImpl cannot be converted to WildcardType
return new WildcardTypeImpl(new Type[] { bound }, EMPTY_TYPE_ARRAY);
^
/Users/vinay/Dev/IdeaProjects/types/src/main/java/com/vinaysshenoy/types/Types.java:86: error: incompatible types: WildcardTypeImpl cannot be converted to WildcardType
return new WildcardTypeImpl(new Type[] { Object.class }, new Type[] { bound });
^
/Users/vinay/Dev/IdeaProjects/types/src/main/java/com/vinaysshenoy/types/Types.java:153: error: incompatible types: ParameterizedType cannot be converted to ParameterizedTypeImpl
Type[] aTypeArguments = pa instanceof ParameterizedTypeImpl
^
/Users/vinay/Dev/IdeaProjects/types/src/main/java/com/vinaysshenoy/types/Types.java:154: error: incompatible types: ParameterizedType cannot be converted to ParameterizedTypeImpl
? ((ParameterizedTypeImpl) pa).typeArguments
^
/Users/vinay/Dev/IdeaProjects/types/src/main/java/com/vinaysshenoy/types/Types.java:156: error: incompatible types: ParameterizedType cannot be converted to ParameterizedTypeImpl
Type[] bTypeArguments = pb instanceof ParameterizedTypeImpl
^
/Users/vinay/Dev/IdeaProjects/types/src/main/java/com/vinaysshenoy/types/Types.java:157: error: incompatible types: ParameterizedType cannot be converted to ParameterizedTypeImpl
? ((ParameterizedTypeImpl) pb).typeArguments
^
/Users/vinay/Dev/IdeaProjects/types/src/main/java/com/vinaysshenoy/types/util/Util.java:52: error: incompatible types: bad type in conditional expression
return c.isArray() ? new GenericArrayTypeImpl(canonicalize(c.getComponentType())) : c;
^
GenericArrayTypeImpl cannot be converted to Type
/Users/vinay/Dev/IdeaProjects/types/src/main/java/com/vinaysshenoy/types/util/Util.java:55: error: incompatible types: Type cannot be converted to ParameterizedTypeImpl
if (type instanceof ParameterizedTypeImpl) { return type; }
^
/Users/vinay/Dev/IdeaProjects/types/src/main/java/com/vinaysshenoy/types/util/Util.java:57: error: incompatible types: ParameterizedTypeImpl cannot be converted to Type
return new ParameterizedTypeImpl(p.getOwnerType(),
^
/Users/vinay/Dev/IdeaProjects/types/src/main/java/com/vinaysshenoy/types/util/Util.java:61: error: incompatible types: Type cannot be converted to GenericArrayTypeImpl
if (type instanceof GenericArrayTypeImpl) { return type; }
^
/Users/vinay/Dev/IdeaProjects/types/src/main/java/com/vinaysshenoy/types/util/Util.java:63: error: incompatible types: GenericArrayTypeImpl cannot be converted to Type
return new GenericArrayTypeImpl(g.getGenericComponentType());
^
/Users/vinay/Dev/IdeaProjects/types/src/main/java/com/vinaysshenoy/types/util/Util.java:66: error: incompatible types: Type cannot be converted to WildcardTypeImpl
if (type instanceof WildcardTypeImpl) { return type; }
^
/Users/vinay/Dev/IdeaProjects/types/src/main/java/com/vinaysshenoy/types/util/Util.java:68: error: incompatible types: WildcardTypeImpl cannot be converted to Type
return new WildcardTypeImpl(w.getUpperBounds(), w.getLowerBounds());
^
/Users/vinay/Dev/IdeaProjects/types/src/main/java/com/vinaysshenoy/types/util/Util.java:118: error: incompatible types: bad type in conditional expression
? new ParameterizedTypeImpl(newOwnerType, original.getRawType(), args)
^
ParameterizedTypeImpl cannot be converted to Type
/Users/vinay/Dev/IdeaProjects/types/src/main/java/com/vinaysshenoy/types/util/Util.java:260: error: method does not override or implement a method from a supertype
@Override
^
/Users/vinay/Dev/IdeaProjects/types/src/main/java/com/vinaysshenoy/types/util/Util.java:265: error: method does not override or implement a method from a supertype
@Override
^
/Users/vinay/Dev/IdeaProjects/types/src/main/java/com/vinaysshenoy/types/util/Util.java:270: error: method does not override or implement a method from a supertype
@Override
^
/Users/vinay/Dev/IdeaProjects/types/src/main/java/com/vinaysshenoy/types/util/Util.java:279: error: incompatible types: ParameterizedTypeImpl cannot be converted to Type
&& Types.equals(this, (ParameterizedType) other);
^
/Users/vinay/Dev/IdeaProjects/types/src/main/java/com/vinaysshenoy/types/util/Util.java:313: error: method does not override or implement a method from a supertype
@Override
^
/Users/vinay/Dev/IdeaProjects/types/src/main/java/com/vinaysshenoy/types/util/Util.java:321: error: incompatible types: GenericArrayTypeImpl cannot be converted to Type
&& Types.equals(this, (GenericArrayType) o);
^
/Users/vinay/Dev/IdeaProjects/types/src/main/java/com/vinaysshenoy/types/util/Util.java:363: error: method does not override or implement a method from a supertype
@Override
^
/Users/vinay/Dev/IdeaProjects/types/src/main/java/com/vinaysshenoy/types/util/Util.java:368: error: method does not override or implement a method from a supertype
@Override
^
/Users/vinay/Dev/IdeaProjects/types/src/main/java/com/vinaysshenoy/types/util/Util.java:376: error: incompatible types: WildcardTypeImpl cannot be converted to Type
&& Types.equals(this, (WildcardType) other);
^
Solución
@ Respuesta de Zgurskyi es una buena solución, sin embargo, creo que sólo cura el síntoma del problema real (véase más adelante). Aquí hay otro, en mi humilde opinión forma más limpia para solucionar el problema subyacente: hacer que las importaciones de los tipos anidados de com.vinaysshenoy.types.util.Util
partir com.vinaysshenoy.types.Types
no estático :
diff --git a/src/main/java/com/vinaysshenoy/types/Types.java b/src/main/java/com/vinaysshenoy/types/Types.java
index e3a44d8..92ac237 100644
--- a/src/main/java/com/vinaysshenoy/types/Types.java
+++ b/src/main/java/com/vinaysshenoy/types/Types.java
@@ -17,9 +17,9 @@ package com.vinaysshenoy.types;
import static com.vinaysshenoy.types.util.Util.EMPTY_TYPE_ARRAY;
-import static com.vinaysshenoy.types.util.Util.GenericArrayTypeImpl;
-import static com.vinaysshenoy.types.util.Util.ParameterizedTypeImpl;
-import static com.vinaysshenoy.types.util.Util.WildcardTypeImpl;
+import com.vinaysshenoy.types.util.Util.GenericArrayTypeImpl;
+import com.vinaysshenoy.types.util.Util.ParameterizedTypeImpl;
+import com.vinaysshenoy.types.util.Util.WildcardTypeImpl;
import static com.vinaysshenoy.types.util.Util.getGenericSupertype;
import static com.vinaysshenoy.types.util.Util.resolve;
(Por cierto, aparte de @Zgurskyi También puede reproducir este con un manual javac
de llamadas sólo tengo un JDK instalado;. Quizá @ Zgurskyi de javac
. En la línea de comando no es de la misma JDK que los usos Gradle)
Problema real
Estáticamente importar clases anidadas (no sólo a la clase de los miembros ), aunque esto nunca debería ser necesario. En realidad estoy sorprendido de que esto parece por lo general el trabajo, pero al parecer algunos compiladores Java al menos estrangulador en él bajo ciertas circunstancias.
En su caso, el compilador de Java que utiliza Gradle no pudo resolver correctamente las importaciones en el siguiente escenario (sólo un bruto, no tiene descripción muy técnica de lo que hace el compilador):
- cuando se procesa
com.vinaysshenoy.types.util.Util
, el compilador encuentra una importación estática decom.vinaysshenoy.types.Types.arrayOf
, por lo que las miradas del compilador en lacom.vinaysshenoy.types.Types
clase. com.vinaysshenoy.types.Types
tiene una importación estática decom.vinaysshenoy.types.util.Util.GenericArrayTypeImpl
, por lo que las miradas del compilador en el anidadoGenericArrayTypeImpl
clase.com.vinaysshenoy.types.util.Util.GenericArrayTypeImpl
(usosjava.lang.reflect.
)GenericArrayType
, sin embargo, la importación de ese tipo no era todavía procesadas en este punto que conduce al error “no puede encontrar el símbolo”.
Podría decirse que también podría ser considerado como un error de JDK que esto funciona con algunos compiladores, pero no con otros.