2012-06-14 16 views
9

tengo la clase de dos java de la siguiente manera:cómo ejecutar la clase de Java con el nombre del paquete tiene

1.

none package class 
System.out.println("App1 hello world..."); 

2.

has package 
package java.java.package1; 

System.out.println("App1 hello world..."); 

entonces, compilar y ejecutar ellos, el resultado de la siguiente manera:

D:\javaTest>javac App1.java 

D:\javaTest>javac App2.java 

D:\javaTest>java App1 
App1 hello world... 

D:\javaTest>java java.java.package1.App2 

Exception in thread "main" java.lang.NoClassDefFoundError: java/java/package1/Ap 
p2 
Caused by: java.lang.ClassNotFoundException: java.java.package1.App2 
     at java.net.URLClassLoader$1.run(Unknown Source) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at java.net.URLClassLoader.findClass(Unknown Source) 
     at java.lang.ClassLoader.loadClass(Unknown Source) 
     at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) 
     at java.lang.ClassLoader.loadClass(Unknown Source) 
Could not find the main class: java.java.package1.App2. Program will exit. 

así que cómo ejecutar la clase App2?

Respuesta

18

Usted debe compilar utilizando la opción -d para que las clases terminan en una jerarquía de directorios correspondiente:

javac -d . App2.java 
java java.java.package1.App2 

Además, no se debe utilizar un nombre de paquete a partir de java en el primer lugar.

Además, si coloca la fuente en una jerarquía de directorios adecuada y la compila/ejecuta desde la raíz de la jerarquía, no tendrá este problema.

+1

Además de lo que dijo Chuck Norris: Cuando compila y está en la raíz de la jerarquía de directorios, debe usar '/' en lugar de '.'. Cuando ejecuta el programa, se invierte: use '.' en lugar de'/'. –

0

App2 necesita estar en el directorio java/java/package1. En java, el nombre del paquete y el directorio para el código fuente deben coincidir. ¿No obtuviste un error de compilación?

1

usted tiene que poner -d directory Options..because

Establecer el directorio de destino para los archivos de clase. Si una clase es parte de un paquete , javac coloca el archivo de clase en un subdirectorio que refleja el nombre del paquete, creando directorios según sea necesario. Por ejemplo, si especifica -d c: \ myclasses y la clase se llama com.mypackage.MyClass, el archivo de clase se llama c: \ myclasses \ com \ mypackage \ MyClass.class.

0

Crea un nuevo directorio. Este es el directorio que contiene su trabajo, y no es el inicio de sus paquetes.

Por ejemplo, creo una carpeta/terri para comenzar.

Luego creo la estructura de la carpeta/clarie/andrea debajo de ella. Mi paquete se llamará claire.andrea en este ejemplo. Los nombres de los paquetes normales comienzan con com y luego con el nombre de una compañía o algo así (o java para paquetes java estándar, así que no los use: como java.lang. *).

En la carpeta andrea, creo un archivo java llamado Saluton.java con la clase Saluton (que simplemente imprime hola). El nombre de clase y el nombre de archivo deben coincidir.

Recopilar, del terri/carpeta:. Javac \ Claire \ Andrea \ Saluton.java Esto creará un Saluton.class en el \ terri \ Claire \ Andrea \ Saluton.class

Para ejecutar: (otra vez desde/terri), lo hago: java -cp. claire.andrea.Saluton Lo que dice, usa la ruta de clase de mi directorio actual.
Mi programa principal está en el paquete claire.andrea y el nombre de clase es Saluton.

Aquí está la carrera: \ terri java -cp. claire.andrea.Saluton

"Hello World".

Para resumir, el nombre del paquete coincide mucho con la estructura de directorios subyacente. El archivo (si hace referencia a un paquete) debe vivir dentro de la estructura del directorio al que hace referencia. Si compilo Saluton.java en/terri con el paquete claire.andrea no he encontrado una manera de ejecutarlo, compila bien.

Además, el nombre de archivo de la clase debe coincidir con la clase pública en ese archivo.

Ejecutar, paquete.Clase. En general, los paquetes no están en mayúscula y las clases son.

Cuestiones relacionadas