2012-07-12 37 views
11

Bien, soy muy nuevo en linux y línea de comandos, y bastante nuevo en Java. Conseguí una pasantía para construir un programa de Java. Finalmente lo hice en mi máquina (Windows) y ahora tengo que migrarlo a una máquina Linux para probar y luego ejecutarlo como un ejecutable. He leído e investigado mucho sobre linux y comprendido classpaths, pero todavía es muy difícil de comprender por completo. Simplemente no está haciendo clic para mí todavía. ¿Alguien puede explicar el propósito de classpath de una manera simplificada usando ejemplos? Uno de los aspectos más confusos para mí es definir la ruta física al contenedor. ¿Comienzo desde el usr o solo tengo que comenzar desde la carpeta jvm? Si es importante, mi programa java no se encuentra en la carpeta jvm. ¿Alguien puede arrojar algo de luz para mí?Cómo agregar varios archivos jar en classpath en Linux

EDIT: gracias muchachos por su ayuda, no puedo decir que estoy totalmente en claro, pero mi comprensión de mi situación es mucho mejor.

+0

Posible duplicado de [Incluyendo todos los archivos jar en un directorio dentro del classpath de Java] (https://stackoverflow.com/questions/219585/including-all-the-jars-in-a-directory -within-the-java-classpath) – Stewart

Respuesta

10

Utiliza el argumento -classpath. Puede usar una ruta relativa o absoluta. Lo que eso significa es que puede usar una ruta relativa a su directorio actual, O puede usar una ruta absoluta que comienza en la raíz /.

Ejemplo:

bash$ java -classpath path/to/jar/file MyMainClass 

En este ejemplo, la función main se encuentra en MyMainClass y que se incluiría en alguna parte del archivo JAR.

Para compilar es necesario utilizar javac

Ejemplo:

bash$ javac -classpath path/to/jar/file MyMainClass.java 

También puede especificar la ruta de clase a través de la variable de entorno, siga :

bash$ export CLASSPATH="path/to/jar/file:path/tojar/file2" 
bash$ javac MyMainClass.java 

Para cualquier java normalmente compleja proyecto debe buscar el script ant llamado build.xml

+1

Así que si el programa java que estoy tratando de compilar se llama SnortMonitor su ejemplo cambiará a: bash $ java -classpath ruta/a/jar/archivo SnortMonitor –

+1

Ah para compilar usted necesita para llamar a 'javac' en lugar de' java', pero aún usa -classpath y el directorio de origen. – Petriborg

+0

gracias por su ayuda, pero podría ser un poco más específico? Tal vez sea por mi falta de comprensión. Cuando escribo "javac SnortMonitor.java, obtengo una lista de errores y sé que es necesario incluir 2 archivos jar de un directorio llamado jsendnsca.¿Debo incluir esos archivos jar en el classpath cada vez que compilo y ejecuto el programa? –

5

classpath es el lugar donde el compilador de java (comando: javac) y la JVM (comando: java) miran para encontrar las clases a las que hace referencia su aplicación. ¿Qué significa para una aplicación hacer referencia a otra clase? En palabras sencillas que significa utilizar esa clase en algún lugar de su código:

Ejemplo:

public class MyClass{ 
    private AnotherClass referenceToAnotherClass; 
    ..... 
} 

Cuando intenta compilar este (javac) el compilador tendrá la clase AnotherClass. Lo mismo cuando intenta ejecutar su aplicación: la JVM necesitará la clase AnotherClass. Para encontrar esta clase, javac y JVM miran en un (a) lugar (es) particular (es). Esos lugares están especificados por el classpath, que en Linux es una lista de directorios separados por dos puntos (directorios donde debe buscar javac/JVM para ubicar el AnotherClass cuando lo necesiten).

Por lo tanto, para compilar su clase y luego ejecutarla, debe asegurarse de que classpath contenga el directorio que contiene la clase AnotherClass. A continuación, se invoca así:

javac -classpath "dir1;dir2;path/to/AnotherClass;...;dirN" MyClass.java //to compile it 
java -classpath "dir1;dir2;path/to/AnotherClass;...;dirN" MyClass //to run it 

Por lo general, las clases se presentan en forma de "paquetes" llamados archivos jar/bibliotecas.En este caso, usted tiene que asegurarse de que el frasco que contiene la clase AnotherClass está en su classpaht:

javac -classpath "dir1;dir2;path/to/jar/containing/AnotherClass;...;dirN" MyClass.java //to compile it 
java -classpath ".;dir1;dir2;path/to/jar/containing/AnotherClass;...;dirN" MyClass //to run it 

En los ejemplos anteriores se puede ver cómo compilar una clase (MyClass.java), ubicado en el directorio de trabajo y luego ejecute la clase compilada (Note el "." al comienzo de la ruta de clases que representa el directorio actual). Este directorio también debe agregarse al classpath. De lo contrario, la JVM no podrá encontrarlo.

Si tiene su clase en un archivo jar, como especificó en la pregunta, entonces debe asegurarse de que jar también se encuentre en el classpath, junto con el resto de los directorios necesarios.

Ejemplo:

java -classpath ".;dir1;dir2;path/to/jar/containing/AnotherClass;path/to/MyClass/jar...;dirN" MyClass //to run it 

o más generales (suponiendo que alguna jerarquía de paquetes):

java -classpath ".;dir1;dir2;path/to/jar/containing/AnotherClass;path/to/MyClass/jar...;dirN" package.subpackage.MyClass //to run it 

Con el fin de evitar el establecimiento de la ruta de clase cada vez que desee ejecutar una aplicación puede definir una variable de entorno llamado CLASSPATH.

En Linux, en el símbolo del sistema:

export CLASSPATH="dir1;dir2;path/to/jar/containing/AnotherClass;...;dirN" 

o editar el archivo ~/.bashrc y agregar esta línea en algún lugar al final;

Sin embargo, la ruta de clase está sujeta a cambios frecuentes, por lo que es posible que desee establecer classpath en un conjunto central de directorios, que necesita con frecuencia y luego amplía classpath cada vez que necesita solo para esa sesión. De esta manera:

export CLASSPATH=$CLASSPATH:"new directories according to your current needs" 
+0

tendré que definir estos classpaths cada vez que quiera compilar y ejecutar? –

+0

Edité mi respuesta – Razvan

16

Supongamos que tiene varios archivos jar a.jar, b.jar y c.jar. Para añadirlos a la ruta de clase durante la compilación de lo que necesita hacer

$javac -cp .:a.jar:b.jar:c.jar HelloWorld.java 

Para ejecutar hacer

$java -cp .:a.jar:b.jar:c.jar HelloWorld 
0

Paso 1.

vi ~/.bashrc 

Paso 2. Anexar esta línea en el último:

export CLASSPATH=$CLASSPATH:/home/abc/lib/*; (Assuming the jars are stored in /home/abc/lib) 

Paso 3.

source ~/.bashrc 

Después de estos pasos, dirija directamente y ejecute sus programas (p. javac xyz.java)

Cuestiones relacionadas