# Zugriff auf Parallelport nur über Eclipse nicht über .jar !



## alphaChill (22. Jul 2008)

Moin an alle,

bin gerade dabei mir ein Programm zu schreiben, mit dem ich Bits auf die Datenleitung von meinem Parallelport am PC legen kann. Unter Eclipse (3.2) funktionierte das zunächst nicht... hatte immer den Fehler

```
Exception in thread "main" java.lang.UnsatisfiedLinkError: no JPort in java.library.path 
      at java.lang.ClassLoader.loadLibrary(Unknown Source) 
      at java.lang.Runtime.loadLibrary0(Unknown Source) 
      at java.lang.System.loadLibrary(Unknown Source) 
      at directio.IOPortAccess.<clinit>(IOPortAccess.java:44) 
      at sonstiges.LPT_Port_Datenausgabe.main(LPT_Port_Datenausgabe.java:8)
```
Also gegoogelt und zufällig auf einen Seite von einer Schule gekommen:
http://bs-gelnhausen.de/typo3/BG12_2_TW_Materialien.135.0.html
und dort die Datei http://bs-gelnhausen.de/typo3/fileadmin/user_upload/div_Dateien/Java_Tools_Flach_kpl.zip runtergeladen, in der dann die gesuchte JPort.dll drin war. Also hab ich die in meinen Projekteordner eingefügt und der Fehler war weg und ich hatte vollen Zugriff auf meinen Port. (Die Datei "DrvLoad.exe, welche die Datei "giveio.sys" lädt, läuft bei mir auch...)
Als ich das vor einem halben Jahr in der Schule programmiert habe, hat's ohne JPort.dll funktioniert... an der Eclipse-Version liegt's nicht, habe auch die 3.4 getestet, dort bekam ich auch den Fehler... warum brauche ich nun diese Datei??

Naja, wie auch immer. Wollte für meinen Parallelport (über den ich eine LED ansteuere) auch eine schöne GUI haben. Also habe ich mir eine zusammengeschrieben. Diese funktioniert unter Eclipse ohne Probleme, wenn ich die GUI allerdings als Jar-Datei exportiere, regiert das Programm nicht auf den Button-Klick... weiß jemand warum? Hier mal der Programmcode:

```
package sonstiges;

import javax.swing.SwingUtilities;
import java.awt.BorderLayout;
import javax.swing.JPanel;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.BorderFactory;
import javax.swing.border.BevelBorder;
import javax.swing.JButton;

import directio.IOPortAccess;

import java.awt.Point;
import java.awt.Dimension;

public class LPT_GUI_new extends JFrame {

	private static final long serialVersionUID = 1L;

	private JPanel jContentPane = null;

	private JLabel jLabel = null;

	private JPanel jPanel = null;

	private JButton jButton = null;

	private JButton jButton1 = null;
	
	

	/**
	 * This method initializes jPanel	
	 * 	
	 * @return javax.swing.JPanel	
	 */
	private JPanel getJPanel() {
		if (jPanel == null) {
			jPanel = new JPanel();
			jPanel.setLayout(null);
			jPanel.add(getJButton(), null);
			jPanel.add(getJButton1(), null);
		}
		return jPanel;
	}

	/**
	 * This method initializes jButton	
	 * 	
	 * @return javax.swing.JButton	
	 */
	private JButton getJButton() {
		if (jButton == null) {
			jButton = new JButton();
			jButton.setText("LED AN");
			jButton.setSize(new Dimension(100, 40));
			jButton.setLocation(new Point(33, 60));
			jButton.addActionListener(new java.awt.event.ActionListener() {
				public void actionPerformed(java.awt.event.ActionEvent e) {
					IOPortAccess io = new IOPortAccess();
					io.openDriver();
					try {
						io.writePort(0x378, 0x01);
					} catch (Exception e1) {
						// TODO Auto-generated catch block
						e1.printStackTrace();
					}
					io.closeDriver();
					io = null;
				}
			});
		}
		return jButton;
	}

	/**
	 * This method initializes jButton1	
	 * 	
	 * @return javax.swing.JButton	
	 */
	private JButton getJButton1() {
		if (jButton1 == null) {
			jButton1 = new JButton();
			jButton1.setText("LED AUS");
			jButton1.setSize(new Dimension(100, 40));
			jButton1.setLocation(new Point(166, 60));
			jButton1.addActionListener(new java.awt.event.ActionListener() {
				public void actionPerformed(java.awt.event.ActionEvent e) {
					IOPortAccess io = new IOPortAccess();
					
					io.openDriver();
					try {
						io.writePort(0x378, 0x00);
					} catch (Exception e1) {
						// TODO Auto-generated catch block
						e1.printStackTrace();
					}
					io.closeDriver();
					io = null;
				}
			});
		}
		return jButton1;
	}

	/**

	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				LPT_GUI_new thisClass = new LPT_GUI_new();
				thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
				thisClass.setVisible(true);
			}
		});
	}

	/**
	 * This is the default constructor
	 */
	public LPT_GUI_new() {
		super();
		initialize();
	}

	/**
	 * This method initializes this
	 * 
	 * @return void
	 */
	private void initialize() {
		this.setSize(300, 200);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setContentPane(getJContentPane());
		this.setTitle("LED on/off");
		this.setVisible(true);
	}

	/**
	 * This method initializes jContentPane
	 * 
	 * @return javax.swing.JPanel
	 */
	private JPanel getJContentPane() {
		if (jContentPane == null) {
			jLabel = new JLabel();
			jLabel.setText("(c) 2008, TJ");
			jLabel.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
			jContentPane = new JPanel();
			jContentPane.setLayout(new BorderLayout());
			jContentPane.add(jLabel, BorderLayout.SOUTH);
			jContentPane.add(getJPanel(), BorderLayout.CENTER);
		}
		return jContentPane;
	}

}  //  @jve:decl-index=0:visual-constraint="31,14"
```


----------



## parabool (22. Jul 2008)

Ich schätze mal, du hast hast die Bibliothek, die du verwendest, nicht in der
Manifest-Datei angegeben.

Wenn Du dein jar mal über die Kommandozeile startest wirst du
auf jeden Fall sehen  woran es liegt.


----------



## alphaChill (22. Jul 2008)

Joa, kann gut sein... wie kann ich die in der Manifest-Datei angegben? z.Z. lasse ich diese von Eclipse automatisch generieren, aber außer "Manifest-Version: 1.0" steht dort nichts drin...

Hier der Fehler, der ausgegeben wird, wenn ich dir jar-Datei über die Konsole öffnen möchte:






(www.imgbox.de/?img=w17824w96.jpg)

rein müsste die Datei "communication.jar" (welche sich im Ordner "D:/Eigene Dateien/Java/" befindet) und ggf. die JPort.dll (befindet sich im Ordner "D:\Eigene Dateien\Java\workspace\ProName\").


----------



## parabool (22. Jul 2008)

BeimAufruf fehlt noch ein Parameter.
richtig: java -jar LPT.jar

Die Angabe der Klasse, die die main-Mehode beinhaltet sollte auch rein:
also:

 Main-Class: sonstiges.LPT_GUI_new
(In Eclipse geht das auch per Dialog)


im verzeichnis deines jar's erstellst du am besten einen Ordner "lib"
dort steht deine communication.jar

Noch ein Eintrag ins Manifest:
Class-Path: lib\communication.jar


Im Jar-Export Dialog muss nun im 3. Schritt die Option auf "use existing manifest fromworkspace" sein
(ensprechend dann auch das Manifest auswählen)


----------



## alphaChill (23. Jul 2008)

parabool hat gesagt.:
			
		

> im verzeichnis deines jar's erstellst du am besten einen Ordner "lib"
> dort steht deine communication.jar



Wie erstelle ich in einer Jar-Datei ein Verzeichnis?

Ich kann zwar einen Ordner in meinem Projekt anlegen, aber dort nicht die "communication.jar" reinkopieren und später über "Export" -> "JAR file" -> "Select the resources to export" auswählen.


----------



## parabool (23. Jul 2008)

ok, hab mich vielleicht falsch ausgedrückt.

Im selben Verzeichnis wo deine LPT.jar liegt (z.B in "eigene Dateien\" oder wohin auch immer du deine jar exportierst) 
legst du den lib-Ordner an.
Dort hinein kommt dann die communication.jar


das ganze könnte man auch mit build-skripts machen.
Aber bei einen so kleinen Projekt...


----------



## alphaChill (23. Jul 2008)

okay, danke für deine Antwort!
Habe jetzt die Bibliotheksdatei entpackt und die .class-Datei in eine .java-Datei umgewandelt und diese in mein Projekt hinzugefügt. Diese muss ich jetzt mit exportieren und schon läuft's 
Ich hoffe dass ich mir der Umwandlung nichts illegals gemacht habe  

Deinen Vorschlag werde ich morgen testen... aber danke noch mal für deine Hilfe!


----------



## Saxony (24. Jul 2008)

alphaChill hat gesagt.:
			
		

> Ich hoffe dass ich mir der Umwandlung nichts illegals gemacht habe



Ich denke schon! Erste Bürgerpflicht bei solchen Dingen -> zugehörige Lizenz lesen. 

bye Saxony


----------



## alphaChill (24. Jul 2008)

hmmm... die Jar-Datei habe ich mal von meinem ehemaligen Lehrer bekommen... und weder in der .Jar-Datei, noch in der .Java-Datei oder in beiliegenden Dateien (welche nicht dabei waren) waren irgendwelche Copyrights angegeben oder sonstige Texte zu einer Lizens... Aber ich werd's mal löschen und den Lösungsvorschlag von "parabool" testen...

Edit: der Lösungsvorschlag von "parabool" funktioniert leider nicht... bekomme folgende Meldung:




www.imgbox.de/?img=c51104j71.jpg

In der Manifest-Datei steht folgendes:

```
Manifest-Version: 1.0
Main-Class: eine_led.LPT_GUI_AUSWAHL
Class-Path: lib\communication.jar
```


----------



## parabool (24. Jul 2008)

Die LPT.jar hast du auf dem Desktop gespeichert.
Hast du dort auch ein Verzeichnis "lib" in dem die Bibliotek liegt ?


----------



## alphaChill (25. Jul 2008)

genauso so ist es...


----------



## parabool (25. Jul 2008)

Hab noch mal dein Eingangsposting gelesen und die verlinkten Materialien angeschaut.


Die Biblioteken:
comm.jar und tools.jar brauchst du doch ebenfalls:
also

comm.jar und tools.jar ins lib 
und
Class-Path: lib\communication.jar lib\comm.jar lib\tools.jar

dann:

Die nativen Bibliotheken  dll's also JPort und win32comm brauchst du ebenfalls

Entweder als Parameter beim Aufruf;
java -Djava.library.path=pfadzudendlls -jar LPT.jar

wenn sie im lib liegen,reicht auch eine relative Angabe:
java -Djava.library.path=lib -jar LPT.jar



oder die dll's in deinen windows-system-ordner kopieren.  
(Dann kanns du dein Programm per Doppelklick starten, ohne Parameterangabe)



Es gibt auch die Möglichkeit, dll's in's jar zu packen und dann im programm
zu laden über System...hab mich noch nicht damit beschäftigt, google...

Gruss
p


----------



## alphaChill (26. Jul 2008)

Vielen Dank! So läuft es nun


----------

