Todos saben cómo compilar un programa fuente de Java, es decir,cmdir al directorio donde se encuentra el archivo fuentejavac **.javay listo. Cuando el programa tiene una declaración de paquete, ¿se puede simplementejavac **.javausar javac? La respuesta es, por supuesto, que no.noA continuación, un ejemplo sencillo para demostrar qué sucede si sejavac **.javacompila directamente.

Como se muestra a continuación: en el directorio F:\javaweb2班\20160531 hay un archivo A.java. Tenga en cuenta que el archivo fuente contiene una declaración de paquete:

Ejemplo

package mypack; public class A { String name; int age; public void setName(String _name){ this.name =_name; } public void setAge(int _age){ this.age = _age; } public String getName(){ return this.name; } public int getAge(){ return this.age; } public static void main(String[] args){ A a = new A(); //a.setName("zs"); a.name="zs"; a.setAge(18); System.out.println(a.getName()+a.getAge()); } }

Ahora compile A.java directamente con javac A.java. El resultado es el siguiente:

Podemos ver claramente que el archivo de código de bytes A.class ha aparecido en el directorio actual. ¿Se puede ejecutar directamente así? ¡Probemos!

Apareció este error. La razón es que en A.java hay una declaración de paquete. Cuando se ejecuta el archivo fuente A.java, la máquina virtual de Java primero busca el archivo de código de bytes en el directorio actual de A.java. Aunque lo encuentra, debido a la declaración de paquete en A.java, la máquina virtual de Java busca a continuación en el directorio del paquete si existe el archivo de código de bytes A.class. Solo si lo encuentra podrá ejecutarse con éxito. ¡Si no me creen, hagamos el experimento! (Aquí también les enseño cómo compilar A.java con declaración de paquete, es decir, compilación empaquetada: javac -d . A.java)

Ahora la compilación empaquetada se ha realizado con éxito. En este momento podemos ver que el archivo A.class aparece en el directorio mypack. Probemos a ejecutarlo.

En este momento descubrimos que la ejecución todavía no funciona. ¿Por qué? Este es un problema con el que se encuentran muchos principiantes. Aquí todos deben recordar un punto importante: el parámetro del comando Java es el "nombre completo de la clase", no el "nombre del archivo".

El nombre completo de la clase de este programa fuente debería ser mypack.A, por lo tanto, debería escribirse así:java mypack.A

¡Ahora sí se puede ejecutar con éxito!

¡Espera! ¡Aún hay más emocionante! Como uso de paquetes, ¿cómo no explicar la importación, creación y compilación de paquetes?

Esta vez introducimos otra clase de prueba, Test.java, cuyo código es el siguiente:

Ejemplo

import mypack.A; public class Test{ public static void main(String[] args){ A a = new A(); a.setName("zs"); //a.name="zs"; a.setAge(18); System.out.println(a.getName()+a.getAge()); } }

La compilación y ejecución son las siguientes:

El resultado, como era de esperar, es que se puede compilar y ejecutar. El proceso de ejecución es el siguiente: después de compilar Test.java, el archivo de código de bytes generado está en el directorio actual (durante la compilación, busca si hay un archivo A.class en mypack; si no lo hay, la compilación falla). Durante la ejecución, como Test.java no tiene declaración de paquete, la máquina virtual de Java primero encuentra Test.class en el directorio actual y lo ejecuta. Cuando la ejecución llega al lugar donde se hace referencia a la clase A, la máquina virtual de Java comprueba si hay un archivo de código de bytes A.class en el directorio actual. Incluso si lo encuentra, según la importación del paquete en el programa fuente, entra en el paquete para buscar A.class. Solo si lo encuentra podrá ejecutarse con éxito (de hecho, ¡ya lo buscó durante la fase de compilación!).

Vamos un paso más allá: si añadimos la declaración de paquete package mypack1; a la clase de prueba Test.java,

entonces hacemos una compilación empaquetada de Test.java. Aquí les explicaré dos puntos de conocimiento: 1. Al compilar en paquete, el directorio del paquete se crea automáticamente, no es necesario crear manualmente la carpeta con el nombre del paquete; 2. Cuando hay varios archivos java en el directorio actual que necesitan ser compilados o compilados en paquete,javac -d . *.javael comando puede compilar o compilar en paquete todos los archivos java del directorio actual según si el programa tiene declaración de paquete o no.

Entonces, ¿cómo deberíamos ejecutar el archivo Test.java? ¿java Test.java? Evidentemente así no funciona. ¿Recuerdan lo que dije antes? El parámetro del comando Java es el "nombre completo de la clase", no el "nombre del archivo".

Por lo tanto, necesitamos ejecutarlo de la siguiente manera:

De esta manera:

Todo lo anterior son casos generales, es decir, la ruta de clase está en el directorio actual. Si la ruta de clase no está en el directorio actual, ¿todavía se puede ejecutar? ¿Y cómo debería ejecutarse?

Como se muestra en la figura siguiente, coloco Test.java en un directorio de nivel superior. En este caso, necesitamos configurar nosotros mismos el parámetro classpath. Por ejemplo:F:\javaweb2班>java -cp F:/javaweb2班/20160531 mypack1.java; o en cualquier directorio:java -cp F:/javaweb2班/20160531 mypack1.java

¡Así se logra con éxito! El proceso específico de ejecución, que cada uno lo analice y comprenda por sí mismo.

Resumen

    1. El parámetro del comando Java es el "nombre completo de la clase", no el "nombre del archivo".
  • 2. Al compilar en paquete, el directorio del paquete se crea automáticamente; no es necesario crear manualmente la carpeta con el nombre del paquete.
  • 3. Cuando hay varios archivos java en el directorio actual que necesitan ser compilados o compilados en paquete,javac -d . *.javael comando compila o compila en paquete todos los archivos java del directorio actual según si el programa tiene declaración de paquete o no.
  • 4. Cuando la ruta de clase no está en el directorio actual, se necesita usarjava -cp ..., como:java -cp F:/javaweb2班/20160531 mypack1.java。
  • 5. Hay que tener claro el proceso por el cual la máquina virtual de Java ejecuta los archivos de código de bytes según la declaración e importación de paquetes.

Dirección original: https://www.cnblogs.com/xiaoming0601/p/5551113.html