Conectar php con informix (Base de datos de IBM) y PHP con SQL SERVER

Tengo el típico de Fatal error: Call to undefined function: ifx_connect() , la razón debemos de compilar de nuevo php con sus librerías y buscar dependencia todo un problema que al final no me funciono en windows,  pero me acordé de ODBC,el cual busca hacer posible el acceder a cualquier base de datos desde cualquier aplicación, sin importar qué sistema de gestión de bases de datos (DBMS) almacene los datos, a través de una capa intermedia (CLI), ahora lo que hace php es que a través de sus funciones odbc, como odbc_connect(“diver,user,pass”); se conecte a cualquier motor de base de datos con solo decile el driver de conexión, bueno ahora vamos a los pasos a seguir, _OJO_ ya debes tener instalado informix:
 
 
PASO 1: EJECUTAR LO SIGUIENTE EN WINDOWS:

odbc1

PASO 2: HACER CLICK EN AGREGAR:

odbc2

PASO 3: ELEGIR EL SIGUIENTE ODBC INFORMIX DRIVER Y CLICK EN FINALIZAR:

odbc3

PASO 4: COLOCAR NOMBRE A CONEXIÓN:

odbc4

PASO 5: AGREGAR DATOS DE SERVIDOR INFORMIX, NO TE OLVIDES DE USUARIO Y CONTRASEÑA: odbc5

PASO 6 Informix: AHORA EN PHP, PRIMERO EL DRIVER DE INFORMIX , LUEGO EL SERVIDOR, LUEGO LA BASE DE DATOS Y YA ESTÁ TODO

<?php
// INFORMIX SQL permite la conexión usando sql driver
$conexion = odbc_connect(“Driver={IBM INFORMIX ODBC DRIVER}; Server=ol_s_112712_194558; Database=prueba;”, “informix”, “pcjose”);
// consulta SQL a nuestra tabla “cod_prove” que se encuentra en la base de datos “pruebas”
$sql=”SELECT *  FROM tb_proveedor”;
// generamos la tabla mediante odbc_result_all(); utilizando borde de tabla número 1
$result=odbc_exec($conexion,$sql)or die(exit(“Error en odbc_exec”));
print odbc_result_all($result,”border=1″);
?>

PASO 6 QL SERVER: No se olviden que deben seleccionar driver sql en vez de informix, PRIMERO EL DRIVER DE SQL SERVER, LUEGO EL SERVIDOR, LUEGO LA BASE DE DATOS Y YA ESTÁ TODO

<?php
// Microsoft SQL Server usando SQL driver
$conexion = odbc_connect(“Driver={SQL Server}; Server=PCJOSE-PC\PCJOSE123; Database=COTIZACION;”, “sa”, “pcjose”);
// consulta SQL a nuestra tabla “cod_prove” que se encuentra en la base de datos “prueba”
$sql=”SELECT TOP 4 *  FROM CLIENTES”;
// generamos la tabla mediante odbc_result_all(); utilizando borde de tabla número 1
$result=odbc_exec($conexion,$sql)or die(exit(“Error en odbc_exec”));
print odbc_result_all($result,”border=1″);
?>

Espero les ayude. Gracias.

Copiar Excel a Jtable y viceversa (CTRL-V y CTRL-C)

Hola a todos.

En esta semana se me había solicitado en un sistema java que los datos aparte que se carguen a un jtable leyendo un excel, se carguen también copiándolo en la tabla usando las típicas teclas de copiado y pegado de windows (ctrl-v y ctrl-v),  pude hacerlo y decidí colocarlo pensando que otros tal vez estén pasando por la misma situación.

Les presentaré dos archivos uno contiene el Jframe con la tabla y otra la clase en sí misma que se encarga del pegado.

import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

public class table extends JFrame {

    private JPanel contentPane;
    private JTable table;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    table frame = new table();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public table() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);

        JScrollPane scrollPane = new JScrollPane();
        GroupLayout gl_contentPane = new GroupLayout(contentPane);
        gl_contentPane.setHorizontalGroup(
            gl_contentPane.createParallelGroup(Alignment.LEADING)
                .addGroup(gl_contentPane.createSequentialGroup()
                    .addGap(2)
                    .addComponent(scrollPane, GroupLayout.DEFAULT_SIZE, 422, Short.MAX_VALUE))
        );
        gl_contentPane.setVerticalGroup(
            gl_contentPane.createParallelGroup(Alignment.LEADING)
                .addComponent(scrollPane, GroupLayout.DEFAULT_SIZE, 252, Short.MAX_VALUE)
        );

        table = new JTable();
        table.setModel(new DefaultTableModel(
            new Object[][] {
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null}
            },
            new String[] {
                "New column 1", "New column 2", "New column 3", "New column 4", "New column 5", "New column 6"
            }
        ));
        scrollPane.setViewportView(table);
        new PegarExcel(table);
        contentPane.setLayout(gl_contentPane);
    }
}

//*********************************************************************************************************
//Clase que se encarga del pegado
//*********************************************************************************************************

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.datatransfer.*;
import java.util.*;
import java.io.IOException;
//----------------------------------------------------------------------------------------------------------------------
public class PegarExcel implements ActionListener
{
private String rowstring,value;
private Clipboard system;
private StringSelection stringSelection,stsel;
private JTable jTable1 ;
//----------------------------------------------------------------------------------------------------------------------
public PegarExcel(JTable myJTable)
{
jTable1 = myJTable;

KeyStroke paste = KeyStroke.getKeyStroke(KeyEvent.VK_V,ActionEvent.CTRL_MASK,false);

jTable1.registerKeyboardAction(this,"Paste",paste,JComponent.WHEN_FOCUSED);

system = Toolkit.getDefaultToolkit().getSystemClipboard();
}
//----------------------------------------------------------------------------------------------------------------------
public JTable getJTable() {return jTable1;}
//----------------------------------------------------------------------------------------------------------------------
public void setJTable(JTable jTable1) {this.jTable1=jTable1;}
//----------------------------------------------------------------------------------------------------------------------
void showErrorMessage(String msg)
{
JOptionPane.showMessageDialog(null, msg,
msg,
JOptionPane.ERROR_MESSAGE);
}
//----------------------------------------------------------------------------------------------------------------------
void pasteAction()
{
system = Toolkit.getDefaultToolkit().getSystemClipboard();

try{
String data= (String)system.getData(DataFlavor.stringFlavor);
if(data==null) {showErrorMessage("No data on clipboard");return;}

int selectCol=jTable1.getSelectedColumn();
int selectRow=jTable1.getSelectedRow();
if(selectCol<0||selectRow<0) {showErrorMessage("Please Select cell");return;}
//devuelve clipboard contenido

StringTokenizer st,stTmp;
st=new StringTokenizer(data,"\n");
int pasteRows=st.countTokens ();
st=new StringTokenizer(st.nextToken ().trim (),"\t");
int pasteCols=st.countTokens ();
int marginCols=jTable1.getColumnCount()-selectCol;
int marginRows=jTable1.getRowCount()-selectRow;
//revisa espacio disponible
if(marginCols<pasteCols || marginRows<pasteRows)
{showErrorMessage("La tabla no posee el espacio suficiente para pegar los datos");return;}
st=new StringTokenizer (data,"\n");
int rowCount=0,colCount;
//copia a la tabla
while(st.hasMoreTokens())
{
stTmp=new StringTokenizer (st.nextToken (),"\t");
colCount=0;
while(stTmp.hasMoreTokens ())
{
jTable1.setValueAt(stTmp.nextToken (),rowCount+selectRow,colCount+selectCol);
colCount++;
}

rowCount++;
}
}

catch(UnsupportedFlavorException uf)
{
System.out.println ("uf="+uf.getMessage ());
}
catch(IOException io)
{
System.out.println ("io="+io.getMessage ());
}

}
//----------------------------------------------------------------------------------------------------------------------
public void actionPerformed(ActionEvent e)
{
if(e.getActionCommand ().compareTo ("Paste")==0)
{ pasteAction();return;}

}
}


NOTA: PARA ACTIVAR DICHA CLASE CON LA FUNCIONALIDAD LO ÚNICO QUE DEBEN HACER ES: 
new PegarExcel(table);
Donde table es la tabla asignar y este línea debe ir después de la creación de la tabla.

Gracias y espero les sirva cualquier mejora por favor compartir.

Programa aplicaciones de escritorio con PHP

Hola, que interesante no creen!, un mismo lenguaje diversos usos, sin tener que ir aprender otro nuevo, aunque java ya tiene esta virtud, pero, para ser sinceros para web es demasiado complejo, más aún cuando uno quiere crear algo simple, pero eso es otro asunto, actualmente tenemos grandes proyectos que ya nos ofrecen php pero mucho más lejos de la web, me refiero a crear aplicaciones de escritorio y en algunos casos multiplataforma daremos  en estos momento un review de estos:

 

wxPHP

Nacido de una gran librería multiplataforma, esta librería nos permite crear aplicaciones multiplataforma usando php, en la actualidad ya tiene un diseñador RAD (arrastrar soltar que genera el código de la interfaz gráfica) llamado wxformbuilder, además está en constante mantenimiento y desarrollo, con una gran documentación (http://wxphp.org/reference/index.html) ahora lo que me impresiona es todo el avance en su desarrollo han logrado tener ya todo listo para funcionar, todas las clases portadas con orientación a objetos, le veo buen futuro si eres fanático php tal vez sea tu opción.

http://wxphp.org/image/gallery/screenshot-wxaui-support-enabled-.pnghttp://wxphp.org/image/gallery/screenshot-wxphp-frame-wxformbuilder-v32-beta.png

PHP-GTK+

Ejemplos: http://zetcode.com/gui/phpgtktutorial

AL igual que wxphp, esta librería nos permite crear aplicaciones multiplataforma usando php, en la actualidad tiene un desarrollo casi abandonado (aún esta en versiones antiguas de gtk+ 2) y muy lento, además las facilidades de portación a windows no están del todo asegurada, aunque posee una gran documentación (http://gtk.php.net/docs.php) :

Submenu

 

Winbinder

Al igual que los anteriores nos ofrece crear aplicaciones,  pero, únicamente en windows, más de eso no hay que decir, les dejo unas imagenes.

 

NOTA:  Todos son buenos, ninguno malo, pero según gustos yo decante por wxPHP, ya lo estoy viendo está interesante, a ver que tal va, me gusta más porque se basa en wxwidgets y soporta todo de él genial no creen, con el imenso marco de clases y facilidades que nos da, dejen sus opiniones y si conocen otro comentarlo.

Instala php, mysql , apache y mucho más facilmente en windows

Me he topado con el caso de ir a una computadora y necesitar php, pero no tiene (obvio, si es computadora de un amigo, familiar, o una cabina), pero como supongo no soy el único que ha tenido este problema les doy a conocer, lo que he hecho. Pero he encontrado varias herramientas útiles , más aún ofrecen uso de forma portable evitando su instalación, aquí les presento la lista:

Wampserver

WAMP es un acrónimo que es la inicial de lo siguiente:

  • Windows.
  • Apache.
  • MySQL.
  • PHP.

El uso de un WAMP permite servir páginas html, css, js, php, framework,etc a internet o servidor local (localhost), además de poder gestionar datos en ellas, además se extiende con, lenguajes de programación para desarrollar aplicaciones web.

http://i.techrepublic.com.com/blogs/wamp_configuration.png

EASYPHP

Al igual que wampserver easyphp es otra opción muy buena que se integra en módulos para expandir sus opciones. (Ello es su principal ventaja).

XAMP

Es otra gran opción , que nos ofrece una opción portable y aparte no se instala solo se descomprime y ejecuta, ¡Todo listo!, más sencillo imposible.

 

 

 

*Documentación detallada sobre cada uno no es necesaria todos ellos son la compilación de grandes tecnologías principalmente php + mysql + apache.

 

NOTA: AQUÍ VIENE LO IMPORTANTE CUAL USO O CUAL ES MEJOR, PUES NINGUNO TODO DEPENDE DE TUS GUSTOS (ADEMÁS CADA UNO TIENE SUS PROS Y CONTRAS) YO PERSONALMENTE PREFIERO XAMP, PORQUE LLEVO UN ARCHIVO ZIP Y CUANDO QUIERO LO DESCOMPRIMO PARA SU USO, PERO POR COMODIDAD CUANDO ESTOY EN MI PC, USO WAMP, YA LISTO PARA QUE SE INICIE CON EL SISTEMA.

 

Uso de smtp para uso de correo en java

Les presento este código comentado, puesto que tuve diversas preguntas de como hacerlo en java y ahora que lo tengo se los presento para quien lo necesite.

Primero descargen las siguientes librerías:

Javaemail: http://www.oracle.com/technetwork/java/javasebusiness/downloads/java-archive-downloads-eeplat-419426.html#javamail-1.4.4-oth-JPR

Jaf: http://www.oracle.com/technetwork/java/javasebusiness/downloads/java-archive-downloads-java-plat-419418.html#jaf-1.1.1-fcs-oth-JPR

import java.util.Properties;import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public class EnviarMail
{
public static void main(String[] args)
{
try
{
            // Propiedades de la conexión
Properties props = new Properties();
            //usando smtp de gmail
props.setProperty(“mail.smtp.host”, “smtp.gmail.com”);
            //señal de validación
props.setProperty(“mail.smtp.starttls.enable”, “true”);
            //puerto que usa la conexión smtp
props.setProperty(“mail.smtp.port”, “587″);
            //correo de usuario que envia
props.setProperty(“mail.smtp.user”, “aquitucorereodegmail@gmail.com”);
            //valida autorización de usuario
props.setProperty(“mail.smtp.auth”, “true”);
            // Preparamos la sesion
Session session = Session.getDefaultInstance(props);
            // Construimos el mensaje
MimeMessage message = new MimeMessage(session);
message.addRecipient(//usuario que recive
Message.RecipientType.TO,new InternetAddress(“casacasa@pinturasbarsasrl.nixiweb.com”));
            //Message.RecipientType.TO,new InternetAddress(“ponquielcorreoaquienquieresenviarestemensaje@hotmail.com”));
message.setSubject(“Hola”);
message.setText(“Mensaje con Java Mail” + “demostradno uso.” + “jeje………..”);
            // Lo enviamos.
Transport t = session.getTransport(“smtp”);
            //vlidacion de usuario que envia
t.connect(“ponttuusuarioaqui@gmail.com”, “pontucontraseñaaqui”);
t.sendMessage(message, message.getAllRecipients());
            // Cierre.
t.close();
}
catch (Exception e)
{
e.printStackTrace();
}
}
}

Conectar java con mysql

Hola a todos ahora veremos como conectar java con mysql.

Primero, descargamos ,el driver, interfaz intermedia entre el lenguaje java y mysql:

http://dev.mysql.com/downloads/connector/j/

Segundo, abrimos un IDE ya sea eclipse o netbeans (menciono estos porque son los que uso) y creamos un nuevo proyecto con una clase , en mi caso mi clase y archivo.java se llamarán prueba1.

Tercero descomprimimos el driver y te queda una carpeta en mi caso, mysql-connector-java-5.0.8, adentro tenemos un .jar que es, mysql-connector-java-5.0.8-bin.jar, este lo copiamos dentro de la capeta de nuestro proyecto, luego lo agregamos al IDE que estemos usando como otra libreria o jar en el proyecto y listo.

Cuarto ahora crear la base de datos, en el siguiente enlace (la base de datos lo saqué de internet , no lo cree yo):

http://samples.unijimpe.net/demo-empresa.sql

o copialo de aquí:

use demo;
#----------------------------
# Table structure for empresa
#----------------------------
CREATE TABLE `empresa` (
 `idemp` int(11) NOT NULL auto_increment,
 `nombre` varchar(180) NOT NULL default '',
 `direccion` varchar(180) NOT NULL default '',
 `telefono` int(8) NOT NULL default '0',
 `imagen` varchar(50) NOT NULL default '',
 PRIMARY KEY (`idemp`)
);
#----------------------------
# Records for table empresa
#----------------------------
insert into empresa values
(4, 'Pesacon', 'Jr. Los Astrónomos Mz. C 11 Lt. 13', 3872056, 'b55dd5_001048 balanzas pesacon.jpg'),
(46, 'Quipu Digital', 'Carret. Central Km. 21, 730', 3584531, '424cce_001040 internet quipu digital.jpg'),
(13, 'Courier Cristiano Jeshua', 'Jr. Risso 538', 96464860, 'd621a7_001103 courier jeshua.jpg'),
(17, 'Serv. Ledesma SAC', 'Prolg. Iquitos 2200', 2659006, 'ledesma.jpg'),
(18, 'Sonido Profesional Arriola', 'Alicia Alarcón 400', 4820496, '7a88d4_001416 equipos de sonido arriola.jpg'),
(25, 'Juegos Emperatriz', 'Teodoro Cárdenas 790, Sta. Beatriz', 4714603, 'fc0c9b_002216 juego recreativos.jpg'),
(27, 'Stockholm Hipermedia S.A.', 'Los Calderos 140, Urb. Vulcano', 3494222, '898810_001044 muebles stockhom.jpg'),
(28, 'Notaria Beatriz Zevallos G.', 'Av. Túpac Amaru 782, 2º Piso', 4852526, 'd02fcf_001025 notaria giampietri.jpg'),
(30, 'A & B Hidrosistemas SAC', 'Av. Tomás Marsano 1265', 2710263, 'cb2dc7_002207 Hidrosistemas.jpg'),
(33, 'Macro Work SAC', 'Calle La Habana 280', 4222122, 'a92b21_002003 macro word.jpg'),
(36, 'Per Systems SA', 'Av. Arenales 2523', 4226322, '32f133_002086-per-antivirus.jpg'),
(37, 'Transporte Torre Fuerte', 'Calle Costa Azul Mz. B Lt. 16', 2511749, 'cdcd2d_002113 transporte torre fuerte 1.jpg'),
(51, 'Global Medica', 'Jr. Pablo Bermudez 192', 4336470, '556cd1_001375 clinica global medica.jpg'),
(39, 'Distribuidora Mesajil Hnos.', 'Jr. Camaná 1163', 4239453, '9be658_002002 mesajil hnos s.a.c.jpg'),
(55, 'Lima International School', 'Av. La Molina 1255, Sol de La Molina', 4790846, '2a5958_002213school tomorrow 3.jpg'),
(59, 'Sandwiches Passatore', 'Jr. Toribio Seminario 696', 4508684, '46d48f_002208 sandwiches passatore.jpg'),
(61, 'Publimedios', 'Av. Independencia 879, Huamanga', 312436, '9c6a82_002226 publicistas publimedios.jpg'),
(63, 'AJEPER', 'Av. La Paz Lt.30, Sta. María de Huachipa', 3711812, 'a31ad0_gaseosas ajeper 001404.jpg');

Ahora escribimos el código java:

prueba1.java

En el código hay dos partes comentadas, prueben para que observen lo que hacen.

Explicación de lo esencial del código:

DriverManager.registerDriver(new org.gjt.mm.mysql.Driver());//llama al driver

Connection conexion = DriverManager.getConnection (
 "jdbc:mysql://localhost/demo","jose", "ing9226");//conexión a mysql

Statement s = conexion.createStatement();//creamos quien recibe los comandos de consulta

ResultSet rs = s.executeQuery ("select * from empresa");//rs recibe el resultado de la consulta

Cualquier duda o consulta preguntar, que con gusto les contestaré.

Alternativas al print, cout, cin de c/c++ en java para su uso en consola

Algunos programamos java en modo consola, pero a veces necesitamos que la gente o el usuario ingrese datos, pero como hacerlo para que java lo permita al igual que los famosos print,cout y cin de c/c++:

#include <iostream>

using namespace std;

int main() {
string cadena;
cout << "ingrese palabra y luego de enter:" << endl;
cin >>cadena;
cout<<"palabra ingresada\t" <<cadena<<"\n";
return 0;
}

Ahora en java:

import java.io.*;
import java.util.*;
import java.util.Scanner;
public class suma {
public suma()
{
Scanner capt = new Scanner(System.in);
System.out.print("Ingrese numero\t: ");
int a = capt.nextInt();
System.out.print("\nA sumar con\t: ");
int b = capt.nextInt();
System.out.print("resultado = "+(a+b)+"\n");
}
public static void main(String[] args) {
new suma();
 }
}

Lo que tenemos que hacer es declarar un objeto lea desde el teclado o desde el bufer lo que escribimos es la clase scanner esto hace declarar un objeto desde la cual leemos los valores del teclado, esta clase nos ofrece las siguientes funciones:

- nextLine(); Captura una cadena

- nextInt(); Captura enteros

- nextFloat(); Captura decimales

- nextDouble(); Igual que el anterior 

- nextBoolean(); Captura un true o false

Eso es todo espero les sirva.

Compilar java desde terminal GNU/linux

Hola a todos en esta ocasión vamos a compilar archivos java desde una consola.

Primero: Debemos tener instalado el openjdk o el jdk , ya ustedes elijan.

Segundo: Como usuario root, escriben lo siguiente (como yo tengo openjdk):

export JAVA_HOME='/usr/lib/jvm/java-6-openjdk'
PATH=$PATH:$JAVA_HOME:$JAVA_HOME/bin:$JAVA_HOME/jre/bin

Tercero:  Si todo salío bien , ahora pondremos:

update-alternatives --config java

Elegimos la opción que diga: “/usr/lib/jvm/java-6-openjdk/jre/bin/java” ;ponemos el numero y enter; en mi caso me salio 2:

Existen 2 opcioens para la alternativa java (que provee /usr/bin/java).
Selección Ruta Prioridad Estado
------------------------------------------------------------
 0 /
/lib/jvm/java-6-openjdk/jre/bin/java 1061 modo automático
 1 /usr/bin/gij-4.4 1044 modo manual
* 2 /usr/lib/jvm/java-6-openjdk/jre/bin/java 1061 modo manual
Pulse <Intro> para mantener el valor por omisión [*] o pulse un número de selección: 2

!Ahora todo listo: A compilar¡

Primero creamos un archivo holamundo.java y dentro de él escribimos:

public class holamundo {
 public static void main(String[] args) {
 System.out.println("Hola mundo");}
}

Luego vamos a la terminal y compilamos (un decir, java nunca compila), te crea un archivo.class:

javac holamundo.java

Luego ejecutamos el programa

java holamundo.

Ahora creamos un .jar en terminal GNU/linux

java -jar holamundo.jar

y listo, no se olviden creen una carpeta y hacen todo esto en la carpeta..

Espero les sirva.