Creación de un archivo JAR usando JarOutputStream

Creación de un archivo JAR usando JarOutputStream

Alguna vez trate de generar un JAR desde mi aplicacion, pero no lo logre en ese momento, por otros motivos me encontre con la clase JarOutputStream la cual me permite hacer eso, generar un JAR indicandole los paquetes y clases que contendra e inclusive creandole el archivo manifiesto.

Hoy les traigo un sencillo ejemplo de como podemos crear un JAR indicando la carpeta que contiene los archivos .class.

Imagenes

Codigo

package clases;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.jar.Attributes;
import java.util.jar.JarEntry;
import java.util.jar.JarOutputStream;
import java.util.jar.Manifest;

import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class Principal extends JFrame{
 
 JRadioButton btnlibreria;
 JRadioButton btnejecutable;
 JLabel lClase;
 JTextField txtClase;
 JTextField txtNombreFinal;
 File carpeta;
 
 private boolean ejecutable=true;
 
 public Principal(){

  establecerEstilo();
 
  JPanel panelPrincipal=new JPanel();
  panelPrincipal.setLayout(new BorderLayout());
 
  JPanel pexaminar=new JPanel();
 
  JButton btnExaminar=new JButton("Examinar");
  btnExaminar.addActionListener(new ActionListener() {
   
   @Override
   public void actionPerformed(ActionEvent arg0) {
    JFileChooser selector=new JFileChooser();
    selector.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
    int r=selector.showOpenDialog(null);
    if(r==JFileChooser.APPROVE_OPTION){
     carpeta=selector.getSelectedFile();
    }
   }
  });
 
  btnlibreria=new JRadioButton("Libreria");
  btnlibreria.addItemListener(new ItemListener() {
   
   @Override
   public void itemStateChanged(ItemEvent e) {
    if(btnlibreria.isSelected()){
     ejecutable=false;
     txtClase.setVisible(false);
     lClase.setVisible(false);
    }
   }
  });
  btnejecutable=new JRadioButton("Ejecutable");
  btnejecutable.setSelected(true);
  btnejecutable.addItemListener(new ItemListener() {
   
   @Override
   public void itemStateChanged(ItemEvent arg0) {
    if(btnejecutable.isSelected()){
     ejecutable=true;
     txtClase.setVisible(true);
     lClase.setVisible(true);
    }
   }
  });
 
  ButtonGroup bg=new ButtonGroup();
  bg.add(btnlibreria);
  bg.add(btnejecutable);
 
  lClase=new JLabel("Clase Principal:");
  txtClase=new JTextField(15);
 
  pexaminar.add(btnExaminar);
  pexaminar.add(btnlibreria);
  pexaminar.add(btnejecutable);
  pexaminar.add(lClase);
  pexaminar.add(txtClase);
 
  JPanel pabajo=new JPanel();
 
  JButton btnGenerar=new JButton("Generar JAR");
  btnGenerar.addActionListener(new ActionListener() {
   
   @Override
   public void actionPerformed(ActionEvent arg0) {
    Manifest manifest = new Manifest();
    if(ejecutable){
     manifest.getMainAttributes().put(1%2E5%2E0/docs/api/java/util/jar/Attributes.Name.html">Attributes.Name.CLASS_PATH, ".");
     manifest.getMainAttributes().put(1%2E5%2E0/docs/api/java/util/jar/Attributes.Name.html">Attributes.Name.MAIN_CLASS, txtClase.getText());
    }
    manifest.getMainAttributes().put(1%2E5%2E0/docs/api/java/util/jar/Attributes.Name.html">Attributes.Name.MANIFEST_VERSION, "1.0");
    try{
     JarOutputStream target = new JarOutputStream(new FileOutputStream(txtNombreFinal.getText()), manifest);
     add(new File(carpeta.getAbsolutePath()), target);
     target.close();
     JOptionPane.showMessageDialog(null, "Generado Exitosamente!");
    }catch(IOException io){
     io.printStackTrace();
    }
   }
  });
 
  txtNombreFinal=new JTextField(15);
 
  pabajo.add(txtNombreFinal);
  pabajo.add(btnGenerar);
 
  panelPrincipal.add(pexaminar,BorderLayout.NORTH);
  panelPrincipal.add(pabajo,BorderLayout.SOUTH);
 
  add(panelPrincipal);

 }
 
 private void establecerEstilo() {
  try {
    UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
   } catch (ClassNotFoundException e) {
    e.printStackTrace();
   } catch (InstantiationException e) {
    e.printStackTrace();
   } catch (IllegalAccessException e) {
    e.printStackTrace();
   } catch (UnsupportedLookAndFeelException e) {
    e.printStackTrace();
   }
 }

 public static void main(String arg[]){
  Principal p=new Principal();
  p.setVisible(true);
  p.setBounds(0,0,550,200);
  p.setLocationRelativeTo(null);
  p.setDefaultCloseOperation(EXIT_ON_CLOSE);
 }

 private void add(File source, JarOutputStream target) throws IOException
 {
  BufferedInputStream in = null;
  try
  {
   if (source.isDirectory())
   {
    for (File nestedFile: source.listFiles()){
     add(nestedFile, target);
    }
    return;
   }

   JarEntry entry = new JarEntry(source.getPath().replace("\\", "/").substring(carpeta.getAbsolutePath().length()+1));
   entry.setTime(source.lastModified());
   target.putNextEntry(entry);
   in = new BufferedInputStream(new FileInputStream(source));

   byte[] buffer = new byte[1024];
   while (true)
   {
    int count = in.read(buffer);
    if (count == -1)
     break;
    target.write(buffer, 0, count);
   }
   target.closeEntry();
  }
  finally
  {
   if (in != null)
    in.close();
  }
 }

}

Pueden descargar el proyecto directamente desde aquí.

Comentarios

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de Sr. Negativo

¡ Excelente aporte !

¡ Excelente aporte !