No puede usar clases en el paquete predeterminado de un paquete con nombre.
( Técnicamente , puede, como se muestra en la respuesta de Sharique Abdullah a través de la API de reflexión, pero las clases del espacio de nombres sin nombre no están dentro del alcance de una declaración de importación )
Antes de J2SE 1.4, podía importar clases desde el paquete predeterminado usando una sintaxis como esta:
import Unfinished;
Eso ya no está permitido . Entonces, para acceder a una clase de paquete predeterminada desde dentro de una clase empaquetada, es necesario mover la clase de paquete predeterminada a un paquete propio.
Si tiene acceso a la fuente generada por groovy, es necesario un procesamiento posterior para mover el archivo a un paquete dedicado y agregar esta directiva de "paquete" al principio.
Actualización 2014: el error 6975015 , para JDK7 y JDK8, describe una prohibición aún más estricta contra la importación de paquetes sin nombre.
El TypeName
debe ser el nombre canónico de un tipo de clase, tipo de interfaz, tipo de enumeración, o tipo de anotación.
El tipo debe ser un miembro de un paquete con nombre o un miembro de un tipo cuyo tipo más externo que lo encierra léxicamente es un miembro de un paquete con nombre , o se producirá un error en tiempo de compilación .
Andreas señala en los comentarios :
"¿Por qué [el paquete predeterminado] está ahí en primer lugar? ¿Error de diseño?"
No, es deliberado.
JLS 7.4.2. Paquetes sin nombre dice: "La plataforma Java SE proporciona paquetes sin nombre principalmente para su conveniencia cuando se desarrollan aplicaciones pequeñas o temporales o cuando recién se inicia el desarrollo".
De hecho, puedes.
Usando la API de reflexiones puedes acceder a cualquier clase hasta ahora. Al menos pude :)
fuente
val bar = "hi"; val fooClass = Class.forName("FooClass"); val fooMethod = fooClass.getMethod("foo", classOf[Array[String]]); val fooReturned = fooMethod.invoke(fooClass.newInstance(), Array(bar));
Class.forName("FooBar").newInstance().fooMethod("I did it")
Use jarjar para volver a empaquetar el archivo jar con la siguiente regla:
Todas las clases en el paquete predeterminado del archivo jar de origen se moverán al paquete de destino, por lo que podrán acceder.
fuente
Puede usar paquetes en el
Groovy
código y todo funcionará bien.Puede significar una reorganización menor del código
grails-app
y un poco de dolor al principio, pero en un proyecto de griales grande, simplemente tiene sentido organizar las cosas en paquetes. Usamos la convención de nomenclatura de paquetes estándar de Javacom.foo.<app>.<package>
.Tener todo en el paquete predeterminado se convierte en un obstáculo para la integración, como está descubriendo.
Los controladores parecen ser el único artefacto (o artefacto) de Grails que se resiste a ser incluido en un paquete Java. Probablemente todavía no he descubierto el
Convention
para eso. ;-)fuente
solo para completar la idea:
Desde el interior del paquete predeterminado puede acceder a los objetos que residen en paquetes con nombre.
fuente