2011-11-29 12 views
8

Estaba escribiendo algunos programas de práctica para mi certificación Java esta mañana y noté que había escrito mal el nombre de un paquete, por lo que no coincidía con el subdirectorio en el que estaba el archivo java. Recopilé el código esperando un error, pero todo compilado archivo - ni siquiera una advertencia.¿Los paquetes no tienen que coincidir con los subdirectorios en los que se encuentra el archivo java?

Busqué en Google un poco, y la mayoría de las páginas que leí dijeron que el nombre del paquete tenía que coincidir con el subdirectorio. Mi experiencia demuestra que no es el caso.

Cuando intenté ejecutar el programa, no funcionó porque el archivo .class estaba en el directorio incorrecto. La movía al directorio correcto, y dio este mensaje:

Exception in thread "main" java.lang.NoClassDefFoundError: com/sample/directory 
/doesnt/even/exist/OtherPackageMemberModifiers (wrong name: com/sample/chap01/O 
therPackageMemberModifiers) 

Así que lo que pienso que estoy viendo es que el código Java compilar si el paquete y el subdirectorio no coinciden, pero hay no parece ser una forma de ejecutar el código si lo haces. ¿Es eso correcto?

+3

El fenómeno que ruta del paquete y la ruta del directorio son redundante muestra su desagradable cabeza. El compilador habría tenido razón al emitir un error. Sin embargo, eso no sería 100%: paquete src.main.java.com.sample ... o paquete com.sample. ... aún así ambos no generarían ningún error. Javac necesitaría estar basado en directorio (-d) y básicamente se basa en archivos. –

Respuesta

14

El nombre del paquete debe coincidir con el nombre del directorio para que el archivo clase se encuentre correctamente. No tiene para que coincida con el nombre del directorio en tiempo de compilación para algunos compiladores (por ejemplo, javac) aunque otros (como Eclipse) al menos darán una advertencia.

La "forma de ejecutar el código si lo hace" es crear la estructura del directorio y ponerla allí manualmente: el archivo de clase en sí es completamente válido.

Tenga en cuenta que si utiliza el indicador -d, javac creará la jerarquía de directorios adecuada para usted, independientemente de la ubicación de la fuente. Por ejemplo:

javac -d bin ClassInPackage.java 

va a crear los directorios requeridos bajo bin para que coincida con el paquete declarada en ClassInPackage.java.

Una vez dicho todo thise, yo todavía animo a hacer los directorios de origen coincide con los paquetes, a pesar de que se puede salir sin él :)

Cuestiones relacionadas