Error: No se pudo encontrar o cargar la clase principal
En primer lugar, se da un ejemplo:
-
En el
E:\aaa
directorio de la creación A.javaA.java
public class A { public static void main(String[] args) { System.out.println("AAA"); } }
-
Compilar A.java por cmd
javac E:\aaa\A.java
En este momento en E: generación A.class \ directorio bajo el aaa
-
Por cmd plazo A.class (en E: \ aaa directorio)
java A
En esta ocasión se puede ejecutar correctamente
-
Por plazo cmd A.class (en E: \ directorio)
Esta vez se encontrará con que fallan, porque no hay ninguna clase A
3 y 4 por la comparación, se puede concluir que cuando el comando java, es para que parezca en el directorio actual, no recursivos subdirectorios de búsqueda en el directorio actual, si no puede encontrar la clase en el directorio actual, se producirá un error .
Si sólo quiero E: directorio Run \ E: \ aaa \ archivos de clase en el directorio, cómo hacerlo? ¿Qué es necesario utilizar esta opción, la ruta de clases.
ruta de clases
En ejecutar comando java -help
se puede ver las instrucciones oficiales en la ruta de clase esta opción (que también incluye una descripción de otras opciones)
Este comando se utiliza para buscar archivos de clase , que es lo que queremos.
El formato es:
java -classpath 类路径 类名
Clase puede tener una pluralidad de trayectorias, con
;
espaciado, no necesita;
final
A continuación, siga las instrucciones en el directorio E: \, me gustaría añadir comandos ruta de clase:
java -classpath E:\aaa A
Ejecución de éxito!
Esta vez se combina la segunda parte de la ruta de clase de vista, se puede ver por qué llevamos a cabo en el comando actual directorio de java para ejecutar el archivo de clase no es ningún problema. Porque cuando se ejecuta el comando java, de hecho, se unirá al directorio actual como un parámetro cuando se ejecuta.
Es decir, llevamos a cabo java A
comandos, ejecuta realmente java -classpath . A
, lo que .
representa el directorio actual.
paquete
Lo anterior es sólo una clase simple, una clase no pertenece a ningún paquete, en la práctica, vamos a poner la clase en el paquete, como un gran armario dividido en muchos pequeños rejilla, es fácil encontrarnos. En general, los nombres de paquetes están escritos en empresas de nombres de dominio inversa, similares a com.icecoffee
este.
paquetes de varias etapas de Java son en forma de carpetas de varios niveles en el sistema de archivos, como com.icecoffee.test
corresponde al sistema de archivos es com\icecoffee\test
una carpeta tales multinivel. Siendo ese el caso, permítanme comenzar preguntando, si queremos ejecutar una com.icecoffee.test
clase B bajo el paquete, que mi comando debería ser así? Como se muestra a continuación.
-
La creación de B.java \ bbb \ directorio: E
B.java
package com.icecoffee.test; public class B { public static void main(String[] args) { System.out.println("BBB"); } }
-
Compilar B.java
javac B.java
En el E: \ bbb \ directorio creado en el marco del archivo B.class, esta vez veo archivo B.class por JD-GUI, encontrar información de paquetes en el archivo no está en el código fuente
-
La creación de com \ icecoffee \ test directorio \ bbb \ directorio de niveles múltiples, mover el archivo en el directorio B.class prueba: en E
Este tiempo de visión por JD-GUI nuevo archivo B.class, encontrar esta línea de información del paquete de código allí, ¿por qué poner en el paquete correspondiente tendrá esta línea de código, no sé en la actualidad.
-
El primer intento de ejecutar B.class
java -classpath E:\bbb B
un error
-
El segundo intento de ejecutar B.class
java -classpath E:\bbb\com\icecoffee\test B
un error
-
B.class correcta operación del comando
java -classpath E:\bbb com.icecoffee.test.B
Este contraste de 4,5,6 tres comandos, podemos concluir que cuando la clase a la que se ubica en un paquete, el comando correcto es la capa más externa del paquete en el mismo directorio como parámetro la ruta de clase, nombre de la clase frente a la necesidad de añadir paquete de niveles múltiples, es decir, el nombre de la clase que se escribirá de manera nombre de clase completo. En éste, trato al paso 5 parámetros de varios niveles incluidos en el paquete se ejecutan en la ruta de clase, ha demostrado ser inviable.
tarro
paquete frasco es de varios archivos de clase en un paquete comprimido, archivos .jar se pueden abrir para ver por el software de compresión.
En cmd por jar -help
puede ver el uso relacionado con el comando jar
Ahora soy parte del tercer paquete de archivos B.class en un paquete frasco
En el E: \ bbb \ directorio, ejecute:
jar cvf B.jar com
com representa el directorio para ser envasados, ya que B.class pertenecen a
com.icecoffee.test
este paquete, la capa más externa del paquete es com, comando jar recursivamente el directorio
Tras el éxito de la compresión generará un archivo comprimido B.jar en el directorio actual.
También podemos ejecutar directamente paquete frasco B.class
java -classpath E:\bbb\B.jar com.icecoffee.test.B
Ejecución de éxito!
Además, es necesario saber es que en la ejecución del mandato java, además de los parámetros de la ruta de clases, JVM irá jre \ lib y jre \ lib \ ext tanto en la categoría de búsqueda directorio por defecto, por lo que importamos el JDK además de la java.lang
parte exterior del paquete de la clase puede ser compilado para ejecutarse en la causa.
Por ejemplo, java.util.Date
esta clase se encuentra bajo rt.jar jre \ lib en este paquete
¿Por qué es, además de java.lang
fuera de la bolsa? Debido a que las clases del paquete es muy común, casi todas las clases de encargo necesita utilizar este paquete en la categoría, por ejemplo String
. Por lo tanto, se introducen implícitamente todas las clases de este paquete, sin pasar por el archivo Java import
explícitamente importación.