Archive for January, 2009

JAVA and JAR’s from the command line

Friday, January 23rd, 2009

This is a small little tutorial which will explain how to create your own little Java application which have dependencies which are in other JAR files

First create the following directory structure:

java_test
    |
    |__myapp
    |     |__src
    |     |   |__ch
    |     |       |__eitchnet
    |     |            |__java
    |     |                 |__Main.java
    |     |__META-INF
    |     |    |__MANIFEST.MF
    |     |__bin
    |
    |__mydep
    |     |__src
    |     |   |__ch
    |     |       |__eitchnet
    |     |            |__helloworld
    |     |                 |__HelloWorld.java
    |     |__bin
    |
    |__deploy
        |__lib

The MANIFEST.MF file has the following content:

	Main-Class: ch.eitchnet.java.Main
	Class-Path: mydep.jar

The Main.java file has the following content:

  package ch.eitchnet.java;

  import ch.eitchnet.helloworld.HelloWorld;

  public class Main {
      public static void main(String[] args) {
      HelloWorld hw = new HelloWorld();
      System.out.println("HelloWorld instances: " + hw.getInstancesCount());
    }
  }

The HelloWorld.java has the following content:

  package ch.eitchnet.helloworld;

  public class HelloWorld {
    private static int instances;

    public HelloWorld() {
      System.out.println("Created HelloWorld object");
      instances++;
    }

    public int getInstancesCount() {
      return instances;
    }

    protected void finalize() {
      instances--;
    }
  }

Change your directory to be in the root of our project

Compile the dependency first:

find mydep/src/ -name "*.java" | xargs javac -d mydep/bin/

Should you be using a windows system, then you have compile file by naming each one. See the java help file for more information

Create the jar:

jar cvf ./deploy/mydep.jar -C ./mydep/bin ./

Compile the app:

find myapp/src/ -name "*.java" | xargs javac -classpath ./deploy/*.jar -d myapp/bin/

Should you be using a windows system, then you have compile file by naming each one. See the java help file for more information

Create the jar:

jar cmvf ./myapp/META-INF/MANIFEST.MF ./deploy/myapp.jar -C ./myapp/bin ./

Run the app by specifying everything explicitly:

java -classpath ./deploy/myapp.jar:./deploy/mydep.jar ch.eitchnet.java.Main

Or by running directly allowing the MANIFEST.MF to do its magic:

java -jar ./deploy/myapp.jar

tutorial files

grretings eitch

JSF and PDF’s

Thursday, January 22nd, 2009

This is a quick snipped on transmitting a PDF in a JSF context:

byte[] bytes = getPDFStreamAsArray();
FacesContext faces = FacesContext.getCurrentInstance();
HttpServletResponse response =
(HttpServletResponse) faces.getExternalContext()
.getResponse();
response.reset();
response.setContentType("application/pdf");
response.setContentLength(bytes.length);
response.setHeader("Content-disposition", "inline;filename="file.pdf""); // inline or attachment
response.setHeader("Cache-Control", "cache, must-revalidate");
ServletOutputStream out = response.getOutputStream();
out.write(bytes);
faces.responseComplete();

JSF and EL (Expression Language) rant !

Tuesday, January 20th, 2009

Beware people… Referring to missing methods in a Bean from a XHTML page using the expression language yields an exception, but referring to a *private* method, doesn’t to nothing. No exception, no message, just plain and simply nothing.

I spent hours trying to understand why my application didn’t work, and now I know it: Be careful that your exposed method is not marked as *private* in your bean!!

eitch

Java RMI quick and dirty

Friday, January 16th, 2009

Your object which will be accessible through RMI must meet the following requirements:

  • have its own interfaces which extends java.rmi.Remote
  • all methods must “throws RemoteException
  • all returned returned objects must implement java.io.Serializable

Starting a RMI server:

  • Set system property: System.setProperty("java.rmi.server.hostname", "hostname");
  • create registry: Registry registry = LocateRegistry.createRegistry(1099);
  • export Object: RemotableObject stub = (RemotableObject) UnicastRemoteObject.exportObject(remoteObject, 0);
  • bind object: registry.rebind("RemoteName", stub);

Remote call:

  • get Registry: Registry registry = LocateRegistry.getRegistry("hostname");
  • get Remote object: RemotableObject remoteObject = (RemotableObject) registry.lookup("RemoteName");
  • call method: remoteObject.remoteMethod();