¿Cómo ejecutar el archivo de clase Java que está en un directorio diferente?

En este artículo, aprenderemos cómo usar las utilidades, clases y miembros de otros proyectos. Antes de continuar, conozcamos algunas palabras clave.

ruta de clases

Classpath es la ubicación desde donde JVM inicia la ejecución de un programa. Similar al comportamiento clásico de carga dinámica, cuando se ejecutan programas Java, la máquina virtual Java encuentra y carga las clases con pereza (carga el código de bytes de una clase solo cuando la clase se usa por primera vez). El classpath le dice a Java dónde buscar en el sistema de archivos los archivos que definen estas clases. Las variables y los métodos que son accesibles y están disponibles en classpath se conocen como variables de classpath. Por defecto, JVM siempre accede a las clases classpath mientras ejecuta un programa. JVM siempre entra en lo más profundo de classpath para buscar una clase o recurso.

La JVM busca y carga clases en este orden:

  1. clases de arranque: las clases que son fundamentales para la plataforma Java (que comprenden las clases públicas de la biblioteca de clases de Java y las clases privadas que son necesarias para que esta biblioteca sea funcional).
  2. clases de extensión: paquetes que están en el directorio de extensión de JRE o JDK, jre/lib/ext/paquetes y bibliotecas definidos por el usuario

Usando la palabra clave de importación

La palabra clave de importación se usa en Java para importar clases del classpath del proyecto actual. Puede importar clases de diferentes paquetes pero desde el mismo classpath. Debe recordarse que el empaquetado de una clase comienza desde classpath. Supongamos que tiene la estructura de directorios de la siguiente manera:

a > b > c > d > class A

y su classpath comienza desde c, entonces su clase debería estar en el paquete d, no en abcd .

Usando la opción classpath -cp

La palabra clave de importación puede importar clases desde la ruta de clases actual, fuera de la ruta de clases no se puede usar la importación. Ahora suponga que ya tiene un proyecto en el que ha utilizado algunas clases de utilidad, que también necesita en su segundo proyecto. Luego, en esta situación, la palabra clave de importación no funciona porque su primer proyecto está en otro classpath. En ese caso, puede usar el comando -cp mientras compila y ejecuta su programa.

Procedamos con el siguiente ejemplo. Cree una estructura de directorios como se muestra en la siguiente figura.

cp_tutorial

Aquí tienes 2 proyectos proj1 y proj2. proj1 contiene src y clases. En el directorio src, mantendremos los archivos .java que son archivos fuente y en el directorio de clases, mantendremos los archivos .classes que son archivos generados después de compilar el proyecto.
Los siguientes son los pasos para ejecutar el archivo de clase Java que se encuentra en un directorio diferente:

  • Paso 1 (Crear clase de utilidad): Cree A.java en el directorio src que contiene el siguiente código.

    //java utility class
    public class A
    {
        public void test()
        {
            System.out.println("Test() method of class A");
        }
    }

    Aquí, tenemos una clase de utilidad que es A.

  • Paso 2 (clase de utilidad de compilación): abra el terminal en la ubicación proj1 y ejecute los siguientes comandos.
    cp_tutorial/proj1>cd src
    cp_tutorial/proj1/src>javac -d ../classes A.java
    

    Opción -d: se utiliza para almacenar la salida en un directorio diferente. Si no usamos esta opción, el archivo de clase se creará en el directorio src. Pero es una buena práctica mantener los archivos fuente y de clase por separado. después de la opción -d proporcionamos la ubicación del directorio en el que se deben almacenar los archivos de clase.
    Si hay algún error de tiempo de compilación, resuélvalo antes de continuar.

  • Paso 3 (Compruebe si A.java se ha compilado correctamente): Compruebe en el directorio de clases de proj1 si se ha creado o no el archivo de clase. Sin duda, será Sí si su programa fue compilado con éxito.
  • Paso 4 (Escriba la clase principal y compílela): muévase a su directorio proj2. Aquí también hay 2 directorios por las mismas razones. Cree MainClass.java en el directorio src con el siguiente contenido e intente compilarlo.

    //java class to execute program
    public class MainClass{
        public static void main(String[] args){
            System.out.println("In main class");
            A a1 = new A();
            a1.test();
        }
    }
    cp_tutorial/proj2>cd src
    cp_tutorial/proj2/src>javac -d ../classes MainClass.java
    MainClass.java:4: error: cannot find symbol
                    A a1 = new A();
                    ^
      symbol:   class A
      location: class MainClass
    MainClass.java:4: error: cannot find symbol
                    A a1 = new A();
                               ^
      symbol:   class A
      location: class MainClass
    2 errors
    

    Como puede ver, hay un error de tiempo de compilación de que no se encuentra el símbolo A. Si queremos usar la clase A de proj1, entonces tenemos que usar la opción -cp para incluir los recursos de proj1 como se muestra en el siguiente paso.

  • Paso 5 (Compilar con la opción -cp):
    cp_tutorial/proj2>cd src
    cp_tutorial/proj2/src>javac -d ../classes -cp 
    ../../proj1/classes MainClass.java
    

    Ahora, su código se compilará con éxito y se creará MainClass.class en el directorio de clases. -cp significa classpath e incluye la ruta dada con classpath actual y una vez que se incluye, JVM reconoce el símbolo A que es una clase y compila el archivo con éxito.

  • Paso 6 (Ejecutar el programa): Intente ejecutar el programa.

    ejecute los siguientes comandos para ejecutar su programa.

    cp_tutorial/proj2/src>cd ../classes
    cp_tutorial/proj2/classes>java MainClass
    Exception in thread "main" java.lang.NoClassDefFoundError: A
            at MainClass.main(MainClass.java:4)
    Caused by: java.lang.ClassNotFoundException: A
            at java.net.URLClassLoader$1.run(Unknown Source)
            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)
            ... 1 more
    

    Vaya, recibimos un error de que no se encuentra la clase A. Esto se debe a que le dice a JVM sobre la ruta de A solo en tiempo de compilación. Mientras ejecuta MainClass, no sabe que hay una clase A en otros proyectos.

  • Paso 7 (Ejecutar con la opción -cp): Tenemos que proporcionar nuevamente la ruta de la clase A.
    cp_tutorial/proj2/classes>java -cp ../../proj1/classes; MainClass
    In main class
    Test() method of class A
    

    Ahora, ha ejecutado con éxito su programa. No olvides incluir ‘;’ después de la ruta de clase proporcionada. Reemplazar ‘;’ con ‘:’ para SO/Linux.

¿Cómo ejecutar una clase java con un jar en el classpath?

También puede usar el archivo jar en lugar de los archivos de clase de diferentes classpath. El proceso será el mismo, solo tiene que reemplazar la carpeta de clases con la carpeta jar y el nombre de la clase con el nombre del jar.
Suponga que tiene un archivo jar en el directorio lib, luego para compilar puede usar

cp_tutorial/proj2/src>javac -d ../classes -cp ../../proj1/lib MainClass.java

y para ejecutar

cp_tutorial/proj2/classes>java -cp ../../proj1/lib; MainClass

Artículo relacionado: Configuración del entorno Java

Este artículo es una contribución de Vishal Garg . Si le gusta GeeksforGeeks y le gustaría contribuir, también puede escribir un artículo usando contribuya.geeksforgeeks.org o envíe su artículo por correo a contribuya@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.

Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *