studio sintaxis programacion paquetes paquete organizacion móviles importa funciones desarrollo curso crear como aplicaciones java package folder subfolder

sintaxis - paquetes de java y sus funciones



El nombre del paquete es diferente a la estructura de la carpeta pero aún así se compila el código Java (4)

Estoy usando Notepad ++ para escribir mi código Java y el símbolo del sistema para compilarlo y ejecutarlo. A continuación se muestra mi código Java de muestra,

package abraKadabra; public class SuperClass{ protected int anInstance; public static void main(String [] abc){ System.out.println("Hello"); } }

Sin embargo, este archivo está en la siguiente estructura de carpetas:

"usingprotected / superPkg" (usingProtected es una carpeta en algún lugar de la jerarquía en C :)

Por lo tanto, el nombre de mi paquete aquí debería ser algo como usar Prototected.superPkg en lugar de abraKadabra como lo escribí.

Pero, cuando compilo este código Java desde el símbolo del sistema, se compila bien sin errores ni advertencias. ¿Por que es esto entonces? ¿No debería el nombre del paquete adherirse a la estructura de la carpeta? Y si fuera así, ¿cómo se adheriría?

Por ejemplo, si el nombre de mi paquete usa Protot.superPkg, el compilador lo verificará en orden inverso. El directorio de trabajo actual debe ser superPkg, luego el directorio padre debe estar protegido y listo. ¿Es así como comprueba la estructura de la carpeta con el nombre del paquete?


Después de experimentar un poco, entendí cómo usar el nombre del paquete y ejecutar los archivos de clase Java desde el símbolo del sistema.

Supongamos que lo siguiente es mi archivo fuente de Java:

package mySample; public abstract class Sample{ public static void main(String... a){ System.out.println("Hello ambiguity"); } }

Este archivo está en el directorio "D: / Code N Code / CommandLine".

Ahora, cuando compile el código fuente (yendo al directorio anterior desde cmd) usando el siguiente comando:

javac -d . Sample.java

Esto crea automáticamente la carpeta "mySample" en mi directorio actual. Entonces, mi archivo de clase Sample.class está presente en el directorio "D: / Code N Code / CommandLine / mySample". El compilador creó esta nueva carpeta "mySample" a partir del nombre del paquete que di en mi código fuente.

Entonces, si hubiera dado el nombre de mi paquete como "package com.mySample", el compilador crearía dos directorios y ubicaría mi archivo de clase en "D: / Code N Code / CommandLine / com / mySample".

Ahora, todavía estoy en el directorio de trabajo actual, es decir, en "D: / Code N Code / CommandLine". Y para ejecutar mi archivo de clase, doy el siguiente comando:

java mySample.Sample

Por lo tanto, le doy la jerarquía completa del paquete y luego el nombre de la clase. El intérprete de Java buscará en el directorio actual el directorio "mySample" y en el de "Sample.class". Lo hace bien y lo ejecuta con éxito. :)

Ahora, cuando pregunté por qué compila el código fuente de mi paquete incorrecto, compilaría el código correctamente, pero le da a NoClassDefFoundError cuando ejecuto mi archivo de clase. Por lo tanto, el método anterior se puede usar para usar nombres de paquetes desde la línea de comandos


El compilador de Java no comprueba la estructura del directorio cuando compila los archivos de origen. Como mencionó, suponga que tiene un archivo fuente que comienza con la directiva

package abraKadabra;

Puede compilar el archivo incluso si no está contenido en un subdirectorio ... / abraKadabra. El archivo de origen se compilará sin errores si no depende de otros paquetes. Sin embargo, el programa resultante no se ejecutará (a menos que también incluya el nombre del paquete en ejecución). La máquina virtual no encontrará las clases resultantes cuando intente ejecutar el programa.


La especificación del lenguaje Java no obliga a los archivos a estar en un directorio determinado. Opcionalmente, permite que el compilador requiera que las clases públicas estén en archivos con el mismo nombre de la clase, pero no creo que haya nada similar para los paquetes. La Sección 7.2.1 habla sobre las posibles opciones de almacenamiento en un sistema de archivos, pero no dice nada sobre la aplicación de la estructura del código fuente, por lo que puedo ver.

Sin embargo, es una buena práctica, y una convención bastante aceptada universalmente, reflejar la estructura del paquete en la estructura del directorio de origen ... y javac usará esto para tratar de encontrar archivos de origen que no se especifiquen explícitamente para compilarlos.

Tenga en cuenta que si está compilando desde la línea de comandos, de manera predeterminada, cada clase aparecerá en la misma ubicación que el archivo fuente correspondiente, pero si usa la opción "-d" (por ejemplo, "-d bin"), el compilador compilará una estructura de directorio de salida adecuada para usted, enraizada en el directorio especificado.


Si está compilando una sola clase, javac no necesita buscarlo en otra parte. Simplemente compilará el archivo tal como está y colocará la .class resultante en la misma carpeta. Sin embargo, generalmente no podrá usar la clase hasta que la coloque en un directorio "abraKadabra" en uno de los directorios en la ruta de clases.

Sin embargo, si su clase usa otra clase en el paquete, es posible que tenga problemas para compilarla donde está, por el mismo motivo ( javac quiere encontrar la clase y asegurarse de que tenga los métodos y los elementos que utiliza su clase).