2009-06-30 27 views
44

tengo el siguiente en un archivo Java (MyRtmpClient.java):¿Cómo comodín incluyen archivos JAR al compilar?

import org.apache.mina.common.ByteBuffer; 

y ByteBuffer está dentro de un archivo JAR (con la estructura de directorios adecuada, por supuesto). Ese archivo jar y otros que necesito están en el mismo directorio que el archivo .java.

Entonces puedo compilar con la línea:

javac -cp ".;*.jar" MyRtmpClient.java 

pero me sale el error:

MyRtmpClient.java:3: package org.apache.mina.common does not exist
import org.apache.mina.common.ByteBuffer;

¿Cómo puedo incluir archivos jar en mi proyecto?

Respuesta

26

la línea de comandos es correcta, pero hay algunas consideraciones:

  • debe tener javac> = 1.6, porque sólo en esa versión del compilador analiza los "*" como varios archivos JAR.
  • debe estar ejecutando Windows, porque ";" es el separador de ruta para ese sistema operativo solamente (no funciona en Unix, el separador de ruta en Unix es ":").

Supongo que el archivo JAR tiene la estructura de directorios correcta como usted indicó.

+0

¿En serio? No sabía que analizaría el *. Supongo que ha pasado un tiempo desde que compilé cualquier cosa que necesitara un classpath desde la línea de comando. –

+0

La tuya es probablemente la respuesta a mi dilema. Tengo JDK 1.5 :( –

+0

esta es la fuente: http://java.sun.com/javase/6/docs/technotes/tools/windows/javac.html#options – cd1

-2

intente incluir el archivo jar en su línea de comandos para:

javac MyRtmpClient.java ByteBuffer.jar

+0

No, definitivamente no. "Uso: javac " –

+0

Lo intentaré. Pero hay muchos de ellos. No me gusta la idea de tener que incluir todos los archivos jar uno por uno. –

16

javac no entiende * .jar en el argumento de ruta de clases. Debe especificar explícitamente cada jar. p.ej.

javac -cp ".;mina.jar" MyRtmpClient.java 
+0

Sí, * generalmente es interpretado por el intérprete de comandos, pero aquí no tiene posibilidad. –

+1

sí, javac entiende * .jar en el argumento classpath. – cd1

+0

Intenté usar * .jar en Linux antes de escribir mi respuesta y no funcionó. – Mark

8

En su caso, creo que JAVAC no puede encontrar el archivo jar.

Por favor, intente:

project_path
- lib \ a.jar
- src \ paquete \ b.java

cd @PROJECT_PATH 

javac -classpath lib\a.jar src\package\b.java 
+0

En este caso use "javac -cp.; . \ lib \\ ** src \ package \ b ". Esa regla coincidirá con jar bajo lib y también con clases comodín en el directorio actual. – djangofan

-2

No se puede utilizar con -cp javac. En su lugar, debe usar -classpath (suponiendo que las demás configuraciones sean correctas).

4

probablemente por debajo de la sintaxis trabajará en las ventanas del sistema DOS

javac -cp ".;first.jar;second.jar;third.jar" MyRtmpClient.java 
+2

No necesita las comillas a menos que haya espacios en el classpath y en este caso, no hay – djangofan

6

Si tiene utilidades find y tr a su disposición (por ejemplo, estás Linux funciona), se podría hacer:

javac -cp .:`find * -name "*.jar" | tr "\n" ":"` MyRtmpClient.java 

Todos los archivos jar en el directorio actual y todos sus subdirectorios se agregarán (el comando de shell muestra todos los archivos jar y d pone dos puntos como separadores entre ellos).


Explicación:

  • par de los acentos abiertos (`) denotan los comandos shell para ser ejecutado,
  • find * -name "*.jar" hallazgos y las listas de todos los archivos tarro en la jerarquía cuya raíz es la carpeta actual,
  • la barra vertical (|) es una tubería; conecta la salida de find a la entrada del siguiente orden,
  • tr "\n" ":" reemplaza todos los caracteres de nueva línea con dos puntos caracteres.
8

En el JDK 6 javac y sobre Usted podría utilizar (nota la falta de .jar):

javac -cp ".;*" MyRtmpClient.java 

para citar javac - Java programming language compiler

As a special convenience, a class path element containing a basename of * is considered equivalent to specifying a list of all the files in the directory with the extension .jar or .JAR.

For example, if directory foo contains a.jar and b.JAR, then the class path element foo/* is expanded to A.jar;b.JAR, except that the order of jar files is unspecified. All jar files in the specified directory, even hidden ones, are included in the list. A classpath entry consisting simply of * expands to a list of all the jar files in the current directory.

1

En Java 8, la opción". ; * "etc. que se mencionaron anteriormente no parecían funcionar. Probé y encontró que: javac -cp '<location of jars>/*' MyRtmpClient.java

obras:

<location of jar> puede ser/usr/local/clases/* o/home/desarrollador/MyProject/*

Cuestiones relacionadas