Tag Archiv für Eclipse

Exception beim Deployen mit Eclipse und JBoss

Treten folgende Exceptions beim Deployen eine Projektes auf, dann hat bei mir die Lösung weiter unten geholfen. Ausgangssituation ist ein Eclipse Indigo mit JBoss AS 7.1.

Caused by: org.hibernate.HibernateException: Connection cannot be null when 'hibernate.dialect' not set
.....
Caused by: javax.persistence.PersistenceException: [PersistenceUnit: shop1] Unable to build EntityManagerFactory

 

Lösung: 

Die persistence.xml im Verzeichnis META-INF muss im selben Package zu finden sein, in dem auch die Entities liegen.

Genaueres unter: http://docs.jboss.org/jbossas/docs/Server_Configuration_Guide/4/html/ch01s02s01.html

JavaEE / Eclipse: package cannot be resolved

Da ich jetzt schon bei einigen Java Enterprise Tutorials darüber gestolpert bin möchte ich kurz etwas zu dem Problem schreiben, wenn Enterprise Abhängigkeiten nicht aufgelöst werden können.

Ich benutze Eclipse JEE Indigo mit dem Plugin “GlassFish 3.1 Application Server runtime”. Bei der Projekterstellung wählt man dabei üblicherweise die Runtime für das Projekt aus. Also den GlassFish in meinem Fall. Jetzt sollte man meinen, das Eclipse weiß wo es nach den Enterprise Sachen zu suchen hat. Leider ist das anscheint wohl nicht immer der Fall.

Hier ist also das Problem, dass die Annotation “@Stateless” nicht bekannt ist und Eclipse auch nichts Vorzuschlagen weiß. Wenn der Import bekannt sein sollte, z.B. aus dem Tutorial dann kann man ihn natürlich einfach selber hinschreiben. Solange Eclipse aber nicht weiß wo es zu suchen hat, hilft das aber auch nicht.

Abhilfe schafft hier ein Rechtsklick auf das aktuelle Projekt und dann Properties. Im Filter der Properties gibt man nun “Facets” ein und erhält den gesuchten Eintrag “Project Facets”.

Hier muss nun im rechten Bereich unter Runtime nochmal die Runtime ausgewählt werden. Danach findet Eclipse auch die fehlenden Packages. Ein netter Shortcut den ich dabei neu gelernt habe ist Strg+Shift+O. Damit fügt Eclipse automatisch alle fehlende imports hinzu (wenn es welche findet). Auch nützlich für Debugausgaben ist das Shortcut “syso” + Strg+Leertaste. Aus syso wird dann ein System.out.println();

Java Web Start Anwendungen erstellen

Java Web Start Anwendungen erstellen

Im letzten Artikel konnte man die Java Anwendung direkt von der Seite aus starten. Möglich macht das die Java Web Start Technik. Da ich bis zur nächsten Anwendung garantiert wieder vergessen habe, was ich nun eigentlich dafür machen musste, dokumentiere ich hier kurz meine Schritte, solange sie noch frisch sind.

Das Schwierigste war am Anfang die Anwendung mit den Bilder zum laufen zu bekommen. Der Webstart funktionierte schon, aber die Bilder wurden nicht geladen. Auf der dieser Seite habe ich eine Lösung für das Problem gefunden.

Anwendung vorbereiten

In meinem Javaprogramm hatte ich die Bilder zuvor auf folgende Weise geladen:

Image imgWelt = Toolkit.getDefaultToolkit().getImage("welt.gif");

Wobei welt.gif im selben Verzeichnis liegen musste wie die .jar Datei am Ende damit das Ganze funktionierte. Schöner wäre natürlich gewesen ein extra Verzeichnis für Bilder anzulegen. Aber das hatte ich in dem Fall nicht getan.

Trick ist nun eine neue Klasse anzulegen, z.B. wie auf der verlinkten Seite getan mit dem Namen ResourceAnchor mit einem leeren Konstruktor. Im Programm wird nun eine Variable angelegt die später benutzt wird:

ClassLoader cl = ResourceAnchor.class.getClassLoader();

In meinem Fall, wo das Bild im selben Verzeichnis liegt, lade ich das Bild nun wie folgt:

Image imgWelt = Toolkit.getDefaultToolkit().getImage(cl.getResource("welt3.gif"));

Damit funktionieren auch die Bilder per Webstart.

Eclipse Projekt exportieren

Der nächste Schritt ist nun einfach das Eclipse Projekt als Jar-File zu exportieren. Ich habe mich dabei für eine Runnable-Jar entschieden, aber die normale sollte auch klappen, da im .jnlp-File eh nochmals angegeben werden muss wo die Hauptklasse liegt. Also Rechtsklick auf das Eclipse-Projekt -> Export -> Runnable JAR file -> Next -> Launch Configuration auswählen (vorher einfach mal laufen lassen, damit auch eine existiert) bei Library handling habe ich “Package required libraries into generated JAR” ausgewählt und eine Export destination angeben -> Finish

Jar-File signieren

Damit die Webstart Anwendung überhaupt ausgeführt wird, muss sie signiert werden. Dafür muss erst Mal ein Schlüssel angelegt werden.

CMD öffnen und Keyfile erzeugen:
keytool -genkey -keystore meinKeyStore -alias meinName

Jetzt kann mit dem Keyfile die Jar-Datei signiert werden über:

jarsigner -keystore meinKeyStore -storepass keyStorePasswort -keypass aliasPasswort JARDatei.jar meinName

.jnlp erzeugen

Meine Erzeuger-Verbraucher-Problem .jnlp-Datei sieht so aus:

<?xml version="1.0" encoding="utf-8"?>
<jnlp spec="1.0+" codebase="http://santiv.de/webstart/ErzeugerVerbraucher/" href="WebStartErzeugerVerbraucherProblem.jnlp">
 <information>
 <title>Erzeuger-Verbraucher-Problem</title>
 <vendor>Santiv.de - Sven Drees</vendor>
 </information>
 <resources>
 <j2se version="1.6+" href="http://java.sun.com/products/autodl/j2se"/>
 <jar href='ErzeugerVerbraucherProblem.jar' main='true'/>

 </resources>
 <security>
 <all-permissions/>
 </security>
 <application-desc main-class='org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader'/>
</jnlp>

Wobei hier die  codebase, resources und  application-desc main-class die Dinge sind die eine Anpassung benötigen. Die komische Main-Class kommt von dem erzeugten Runnable-Jar File von Eclipse. Um diese rauszufinden, nenne ich mein Jar-File immer in .zip um und betrete das Verzeichnis. In dem Verzeichnis META-INF liegt dann die MANIFEST.MF in der man den Eintrag Main-Class finden kann.

Button einbinden

Um den Launch-Button zu erhalten brauch nur der folgende Code verwendet werden:

<script type="text/javascript" src="http://www.java.com/js/deployJava.js"></script><script type="text/javascript">// <![CDATA[
    var url = "http://java.sun.com/javase/technologies/desktop/javawebstart/apps/notepad.jnlp";
    deployJava.createWebStartLaunchButton(url, '1.6.0');
// ]]></script>

Ausgewechselt werden brauch nur die Variable url.

Quellen: