Ayuda con paquetes en Java: la importación no funciona

Soy un desarrollador de C ++, no un desarrollador de Java, pero tengo que conseguir que este código funcione …

Tengo 2 clases públicas que serán utilizadas por otro producto. Usé la directiva del paquete en cada uno de los archivos de Java.

package com.company.thing; class MyClass ... 

Cuando bash comstackr una aplicación de prueba que usa eso agrego

 import com.company.thing.*; 

El comstackdor javac falla con errores sobre com.company no existe. (incluso si lo compilo en el mismo directorio que los archivos de clase que acabo de hacer un paquete de)

Estoy seguro de que estoy haciendo algo tonto y tonto.

He leído las páginas http://java.sun.com/docs/books/tutorial/java/package/usepkgs.html e intenté configurar una estructura de directorios como / com / company / thing, etc., pero o bien tengo Lo jodí por completo o me falta algo más.

EDITAR gracias por las sugerencias – He probado el classpath anteriormente. No ayuda.

Intenté comstackr

 javac -classpath  client.java 

y el resultado es:

 package com.company does not exist 

Tengo el código que quiero importar (los dos archivos java) en \ com \ company \ product. Los compilo bien. (contienen MyClass) Incluso hice un archivo jar para ellos. Copié el archivo jar al directorio principal.

Entonces lo hice (en el directorio padre con el archivo java del cliente)

 javac -cp  *.java 

el resultado es:

 cannot access MyClass bad class file: MyClass.class(:MyClass.class) class file contains wrong class: com.company.product.MyClass Please remove or make sure it appears in the correct subdirectory of the classpath. 

EDITAR

Obtuve el código de cliente para comstackr y ejecutar si utilicé el nombre completo de MyClass y lo compilé en el directorio principal. Estoy totalmente confundido ahora.

comstackdo sin ningún conjunto de rutas de clase – solo

 javac *.java 

en el directorio principal – y funcionó bien.

Puedo obtener una aplicación de prueba para comstackr, pero eso no va a cortar cuando tengo que integrarlo en el código de producción. Todavía estoy buscando ayuda.

EDITAR:

Finalmente, no estoy seguro de por qué no funcionó antes, pero limpié todos los archivos en toda la estructura del directorio y ahora funciona.

Gracias

De acuerdo, solo para aclarar cosas que ya han sido publicadas.

Debería tener el directorio com , que contiene la company directorio, que contiene el example directorio, que contiene el archivo MyClass.java .

Desde la carpeta que contiene com , ejecuta:

 $ javac com \ company \ example \ MyClass.java

Entonces:

 $ java com.company.example.MyClass
 ¡Hola de MyClass!

Ambos deben hacerse desde la raíz del árbol fuente. De lo contrario, javac y java no podrán encontrar ningún otro paquete (de hecho, java ni siquiera podría ejecutar MyClass ).

Un pequeño ejemplo

Creé las carpetas “testpackage” y “testpackage2”. Dentro del paquete de prueba, creé TestPackageClass.java que contiene el siguiente código:

 package testpackage; import testpackage2.MyClass; public class TestPackageClass { public static void main(String[] args) { System.out.println("Hello from testpackage.TestPackageClass!"); System.out.println("Now accessing " + MyClass.NAME); } } 

Dentro de testpackage2, creé MyClass.java que contiene el siguiente código:

 package testpackage2; public class MyClass { public static String NAME = "testpackage2.MyClass"; } 

Del directorio que contiene las dos nuevas carpetas, ejecuté:

 C: \ examples> javac testpackage \ *. Java

 C: \ examples> javac testpackage2 \ *. Java

Entonces:

 C: \ examples> java testpackage.TestPackageClass
 ¡Hola de testpackage.TestPackageClass!
 Ahora accediendo a testpackage2.MyClass

¿Eso hace las cosas más claras?

Sí, este es un problema de classpath. Necesita decirle al comstackdor y al tiempo de ejecución que el directorio donde viven sus archivos .class es parte de CLASSPATH. El directorio que debe agregar es el padre del directorio “com” al comienzo de la estructura de su paquete.

Para ello, utilice el argumento -classpath para javac.exe y java.exe.

También debería preguntar cómo están empacadas las clases de terceros que está usando. Si están en un JAR, y les recomiendo que los tengan en uno, agreguen el archivo .jar al classpath:

 java -classpath .;company.jar foo.bar.baz.YourClass 

Google para “Java classpath”. Encontrará enlaces como este .

Una cosa más: “importar” no está cargando clases. Todo lo que hace te ahorra escribir. Cuando incluye un extracto de importación, no tiene que usar el nombre de clase completamente resuelto en su código; puede escribir “Foo” en lugar de “com.company.thing.Foo”. Eso es todo lo que está haciendo.

Parece que estás en el camino correcto con tu estructura de directorio. Cuando comstack el código dependiente, especifique el argumento -classpath de javac . Utilice el directorio padre del directorio com , donde com , a su vez, contiene company/thing/YourClass.class

Tienes un montón de buenas respuestas, así que solo lanzaré una sugerencia. Si vas a trabajar en este proyecto por más de 2 días, descarga eclipse o netbeans y crea tu proyecto allí.

Si normalmente no eres un progtwigdor de Java, la ayuda que te dará será invaluable.

No vale la pena la descarga / instalación de media hora si solo gastas 2 horas en ello.

Ambos tienen teclas de acceso rápido / elementos de menú para “Solucionar importaciones”, con esto nunca deberías tener que preocuparte por las importaciones de nuevo.

El clasificador de clases estándar de Java es un elemento rígido para la estructura de directorios. Cada entrada en el classpath es un directorio o archivo jar (o un archivo zip, realmente), que luego busca el archivo de clase dado. Por ejemplo, si su classpath es “.; My.jar”, buscará com.example.Foo en las siguientes ubicaciones:

 ./com/example/ my.jar:/com/example/ 

Es decir, se verá en el subdirectorio que tiene el ‘nombre modificado’ del paquete, donde ‘.’ se reemplaza con el separador de archivos.

Además, cabe señalar que no puede anidar archivos .jar.

Simplemente agregue la entrada classpath (me refiero a la ubicación del directorio principal) en Variables del sistema y en el menú Variables del usuario … Siga: haga clic con el botón derecho en Mi PC> Propiedades> Avanzado> Variables del entorno