Compile Project With External Jars

Compile project with external jars

Dada esta estructura del proyecto, se va a compilar el proyecto usando los jars

/App/com/cristianpeter
├── lib/
       com/companyA/Utils.java
       com/companyB/Helper.java			
├── src/
│   ├── Main.java
│   ├── ClaseA.java
│   └── paquete/
│       └── ClaseB.java

Compilar los .java

Vamos a compilar Utils.java y Extra.java para convertirlos en .class y después crear un jar para cada uno de ellos

/App/com/cristianpeter
├── lib/
       com/companyA/Utils.java
       com/companyA/Utils.class
       com/companyB/Helper.java		
       com/companyB/Helper.class	
├── src/
│   ├── Main.java
│   ├── ClaseA.java
│   └── paquete/
│       └── ClaseB.java

// Reached executing from file : com/cristianpeter/lib
// javac ./com/companyA/Utils.java 
// javac ./com/companyB/Helper.java 

Command

javac -d ./ Utils.java  // compilar la clase

javac -d ./ Utils.java Extra.java // compilar varias clases

// -d = destiny 

Los archivos .class como tienen package generarán esta estructura

  • Explicación

    Cuando declaras esto en Utils.java:

    package com.companyA;

    Le estás diciendo al compilador que la clase pertenece al paquete com.companyA. Por convención y diseño, los .class deben guardarse en una estructura de carpetas que refleje el paquete.

Creando los jars

Vamos a crear los jars de Utils.class y Extra.class dejando una estructura como la siguiente

/App/com/cristianpeter
├── lib/
       com/companyA/Utils.java
       com/CompanyA/Utils.class
       com/CompanyA/Utils.jar

       com/companyB/Helper.java		
       com/companyB/Helper.class	
       com/companyB/Helper.jar	

├── src/
│   ├── Main.java
│   ├── ClaseA.java
│   └── paquete/
│       └── ClaseB.java

// Reached executing from file : com/cristianpeter/lib
// jar cfv ./com/companyA/Utils.jar ./com/companyA
// jar cfv ./com/companyB/Helper.jar ./com/companyB
 
// Error: jar cfv ./com/companyA/Utils.jar -C ./com/companyA ./  
// -C ./com/companyA ./ -> Cambia de directorio a ./com/companyA y
// empaqueta todo lo que esté en ese directorio,
//  preservando la estructura relativa desde ahí".
// por eso los jars no tienen el paquete com.companyB
jar cfv jar_name.jar location_file_jars/jars

jar cfv jar_name.jar file/jars -C out/lib ruta_relativa_file_jars(desde out/lib) 
// c 	-> Create: indica que quieres crear un nuevo archivo .jar
// f -> File: indica que vas a especificar el nombre y ruta del archivo JAR
// v -> Verbose: Muestra detalles
// lib/Extra.jar	El nombre y ruta del archivo JAR que estás creando
// -C out/lib	Cambia temporalmente el directorio a out/lib (como cd out/lib)
// si se usa esta opción, toma esta ruta para encontrar los .class

// com/ejemplo/extra/ExtraHelper.class	Ruta relativa dentro de out/lib de la clase que quieres agregar al jar

Comprobar el contenido de los Jars

jar tf lib/Utils.jar

Run Source Code With dependencies

Teniendo esta estructura, vamos a compilar el código fuente, indicando en el classpath la ubicación de los jars y vamos a ejecutar el programa

/App/com/cristianpeter
├── lib/
       com/companyA/Utils.java
       com/CompanyA/Utils.class
       com/CompanyA/Utils.jar

       com/companyB/Helper.java		
       com/companyB/Helper.class	
       com/companyB/Helper.jar	
       
		out/classes/com/cristianpeter/Main.class
		
├── src/
│   ├── Main.java
				Main.class -> executed 
│   ├── ClaseA.java
│   └── paquete/
│       └── ClaseB.java

// Reached executing from file : com/cristianpeter
// javac -cp "lib/com/companyA/Utils.jar:lib/com/companyB/Helper.jar" -d out/classes $(find src -name "*.java")

Ejecutar el programa manualmente

// Executed from file: com/cristianpeter
// java -cp "out/classes:lib/com/companyA/Utils.jar:lib/com/companyB/Helper.jar" com.cristianpeter.Main
// Está utilizando rutas relativas, como:
// out/classes → el directorio donde están tus .class compilados.
// lib/com/companyA/Utils.jar → tu JAR externo.
// lib/com/companyB/Helper.jar → tu otro JAR. 

Configurar Intellij

  • Configurar intellig
    • 📂 Abrir el proyecto:

      Abre /App/com/cristianpeter como raíz de proyecto en IntelliJ.

    • 🛠️ Estructura de proyecto:

      • Ve a File > Project Structure (Ctrl+Alt+Shift+S).
      • En Modules > Sources:
        • Marca src/ como Sources.
        • Marca out/classes como Classes.
        • Marca lib/ como Library files (o solo usa como ruta de librerías externas).
    • ➕ Agregar los .jar al classpath:

      • Ve a File > Project Structure > Libraries.
      • Haz click en + → Java → agrega:
        • lib/com/companyA/Utils.jar
        • lib/com/companyB/Helper.jar
      • Aplica.
    • ⚙️ Crear configuración de ejecución:

      • Ve a Run > Edit Configurations…

      • Click en +Application

        • Name: Run Main
        • Main class: com.cristianpter.Main (o solo Main si está en default)

        (not needed when was done)

        • Use classpath of module: selecciona tu módulo
        • Classpath: asegúrate que incluya:
          • out/classes
          • los dos .jar desde lib/
    • ✅ Ejecutar:

      • Selecciona la configuración que creaste y dale a ▶️ Run.

Comando

javac -cp "lib/Utils.jar:lib/Extra.jar" -d out/classes $(find src -name "*.java")

java -cp "out/classes:lib/com/companyA/Utils.jar:lib/com/companyB/Helper.jar" com.cristianpeter.Main
// Está utilizando rutas relativas, como:
// out/classes → el directorio donde están tus .class compilados.
// lib/com/companyA/Utils.jar → tu JAR externo.
// lib/com/companyB/Helper.jar → tu otro JAR. 

// -cp -> classpath -> donde estan las dependencias
// -d -> destiny -> carpeta de destino
$(find src -name "*.java") // busca todos los archivos .java dentro del directorio src y subdirectorios.