Deployment - wie am Besten vorgehen?

jf

Bekanntes Mitglied
Hallo, ich möchte ein Projekt exportieren, was ja nicht ganz einfach ist...

Zunächst muss ja eine Manifest.mf erstellt werden. - Gibt es dazu ein gutes Tutorial?

Am liebsten wäre mir die Auslieferung von nur einer jar-Datei - ich verwende aber Bibliotheken (jars) von Dritten, was die ganze Sache etwas verkompliziert. :(
Ich habe mir schon mal One-JAR angeschaut, sehe da allerdings noch nicht klar. Wie läuft das mit dem Ant-Skript? Geht das auch unter Windows?
Kennt jemand auch hierzu ein gutes Tutorial, oder eine bessere Alternative?

Gruß!
 

jf

Bekanntes Mitglied
Praktisch jede große IDE nimmt dir das ab. Du brauchst dich da nicht abstrampeln.
Welche IDE benutzt du denn?
Das klingt ja mal richtig gut!
Habe mir die Export-Funktion (Eclispe 3.6) nochmal etwas genauer angesehen und es dann auch hinbekommen. :D

Was leider noch nicht geht, ist die Anzeige von ein paar Ikons... hättest du hierfür auch einen Tipp?
 

Wildcard

Top Contributor
Single Jar ist oft nicht die ideale Verteilungsform. Prinzipell gibt es 2 Varianten für Single Jar Anwendungen:
1. Alle jars werden entpackt und dann in ein einziges Jar gepackt.
Das ist aus zwei Gründen problematisch:
-Resourcen können mehrfach vorhanden sein und sich dadurch überschreiben (zB Property Files).
-Es ist nicht mehr klar welche Resourcen von dir sind und welche aus welcher externen Bibliothek stammen. Das kann Lizenzprobleme verurachen und du solltest die Lizenztexte deiner jars genau durchlesen bevor du daran denkst das zu tun

2. Die third party jars werden als nested jars in deinem jar verpackt (Eclipse und Netbeans können das, ich weiß nicht welche anderen Tools es noch können). Da die Java Classloader nested jars nicht unterstützen injeziert Eclipse einen Custom Classloader in deine Applikation um die nested jars dennoch laden zu können. Damit gehst du dem Lizenzproblem aus dem Weg, allerdings würde ich mich bei halbwegs komplexen Programmen nicht darauf verlassen das der Classloader Trick nich an anderer Stelle Probleme verursachen kann.

Wenn es eine ernsthafte Anwendung ist und du sie veröffentlichen willst, würde ich nicht versuchen alles in ein Jar zu stecken. Liefer die Anwendung einfach als Zip oder zB per Webstart aus.
 
Zuletzt bearbeitet von einem Moderator:

jf

Bekanntes Mitglied
getClass().getResource und getClass().getResourceAsStream sind deine Freunde.
Ja, darüber bin ich hier schon mehrmals gestolpert...

Aber soweit ich es verstanden habe, muss die Klasse, in welcher mal this.getClass() aufruft, im gleichen Verzeichnis liegen, wie die Ressource. Ich habe aber einen Ordner "res" in der Wurzel meines Projektes liegen, welcher zudem noch weitere Unterverzeichnisse enthält. - Muss ich diesen res-Ordner nun zu einem Quelltext-Ordner machen und eine Klasse zum Laden der Ressourcen darin erstellen?
Wie geht man hier am besten vor?

Müssen die Ressourcen dann auch noch in den Classpath, damit sie mit in die Jar gepackt werden?
Gibt es hierfür auch wieder einen Hilfe durch die IDE?
 

Wildcard

Top Contributor
Aber soweit ich es verstanden habe, muss die Klasse, in welcher mal this.getClass() aufruft, im gleichen Verzeichnis liegen, wie die Ressource.
Nein, muss nicht im gleichen Verzeichnis liegen, du musst nur den Pfad richtig angeben.

Müssen die Ressourcen dann auch noch in den Classpath, damit sie mit in die Jar gepackt werden?
Gibt es hierfür auch wieder einen Hilfe durch die IDE?
Deklariere 'res' als zusätzlich Source Folder, der Rest passiert dann automatisch.
 

jf

Bekanntes Mitglied
Nein, muss nicht im gleichen Verzeichnis liegen, du musst nur den Pfad richtig angeben.
Deklariere 'res' als zusätzlich Source Folder, der Rest passiert dann automatisch.
Hmm, dies habe ich getan - der Pfad, welchen ich erhalte, sieht auch in Ordunug aus (".../bin/res/...").
Allerdings funktioniert es weder bei der exportierten jar, als auch beim Auführen in der IDE... :bahnhof:

Gibt es hier im Forum ein Beispiel für das Laden von Ressourcen?
Ideal wäre es, wenn es sowohl beim Ausfürhen in der IDE, als auch beim Starten der exportierten jar funktionieren würde.
 

jf

Bekanntes Mitglied
Um die Sache etwas einfacher zu machen, habe ich folgende Test-Anwendung geschrieben:

Java:
import java.awt.*;
import java.net.*;

import javax.swing.JFrame;


@SuppressWarnings("serial")
public class ResourceTest extends JFrame {

	Image img = null;

	public ResourceTest() throws Exception {
		this.setVisible(true);
		this.setSize(320, 320);
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
		
		URL myurl = this.getClass().getResource("/test.png");
		this.setTitle(myurl.toString());

		Toolkit tk = this.getToolkit();
		img = tk.getImage(myurl);	
	} // ResourceTest()

	public void paint(Graphics g) {
		g.drawImage(img, 100, 100, this);
	} // paint(Graphics g)

	public static void main(String[] argv) {
		try {
			new ResourceTest();
		} catch (Exception e) {
			e.printStackTrace();
		}
	} // main(String[] argv)

} // class ResourceTest()

Wenn die Ressource test.png im Ordner bin liegt, dann wird sie angezeigt - nicht aber wenn sie im Quelltext-Ordner res liegt. Außrdem funtioniert das Ganze nur, wenn man die Anwendung über die Run-Schaltfläche von Eclipse startet - nicht aber wenn man die runnable jar ausführt... ;(

Wildcard, wärest du bitte so nett und änderst mein Beispiel, so dass es funktioniert?
Ich wäre dir echt dankbar! :applaus:

Gruß, jf
 
Zuletzt bearbeitet:

Wildcard

Top Contributor
Wenn 'res' ein Source Folder ist, dann wird der Inhalt von res ganz automatisch nach bin kopiert.
Vorsicht mit dem Toolkit, das lädt asynchron. Besser du nimmst ImageIO oder ImageIcon. Falls du beim Toolkit bleiben willst brauchst du mindestens noch einen Media Tracker.
 

jf

Bekanntes Mitglied
Wenn 'res' ein Source Folder ist, dann wird der Inhalt von res ganz automatisch nach bin kopiert.
res ist ein Quelltext-Ordner, aber im Archiv (runnable jar) findet sich kein res-Ordner, als auch keine einzige Ressource. ???:L

Vorsicht mit dem Toolkit, das lädt asynchron. Besser du nimmst ImageIO oder ImageIcon. Falls du beim Toolkit bleiben willst brauchst du mindestens noch einen Media Tracker.
Da ich nicht weiß, was ein Media Tracker ist, habe ich die ImageIcon-Variante gewählt... ;)

Ich habe mein Beispiel jetzt dahingehend angepasst, dass man es sowohl in der IDE über die Run-Schaltfläche, als auch über das ausführbare Archiv starten kann:

Java:
import java.awt.*;
import java.net.URL;

import javax.swing.ImageIcon;
import javax.swing.JFrame;


@SuppressWarnings("serial")
public class ResourceTest extends JFrame {

	ImageIcon imgIco = null;

	public ResourceTest() throws Exception {
		this.setVisible(true);
		this.setSize(320, 320);
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
		
		URL url = this.getClass().getResource("/test.png");
		imgIco = new ImageIcon(url);
		this.setTitle(url.toString());
		this.paint(this.getGraphics());
	} // ResourceTest()

	public void paint(Graphics g) {
		if(imgIco != null) {
			g.drawImage(imgIco.getImage(), 100, 100, this);
		}
	} // paint(Graphics g)

	public static void main(String[] argv) {
		try {
			new ResourceTest();
		} catch (Exception e) {
			e.printStackTrace();
		}
	} // main(String[] argv)

} // class ResourceTest()

Leider funktioniert es über das ausführbare Archiv immer noch nicht, da wie erwähnt, dieses die Ressource gar nicht enthält... ;(
Verdammt, es muss doch im großen weiten Netz für diesen Standard-Fall irgendein sinnvolles Beispiel geben! - Und da sage noch einer, Java wäre einfach... :pueh:
 
Zuletzt bearbeitet:

jf

Bekanntes Mitglied
Leider funktioniert es über das ausführbare Archiv immer noch nicht, da wie erwähnt, dieses die Ressource gar nicht enthält...
Habe die Ursache hierfür gefunden: ich hatte die Datei über den Dateimanager in den res-Ordner kopiert und vergessen, den Ordner in Eclipse zu aktualisieren... :oops:

Jetzt funktioniert es wunderbar! :D
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
D Maven deployment über WebDAV Tools - Maven, Gradle, Ant & mehr 3
Oneixee5 Maven Deployment eines Spring-Boot.jar Tools - Maven, Gradle, Ant & mehr 0
P Deployment kein zugriff auf Web-inf tomcat 8 und 7 Tools - Maven, Gradle, Ant & mehr 2
S Binding-Problem von Bibliotheken bei Deployment Tools - Maven, Gradle, Ant & mehr 0
V Maven Deployment eines war zu JBoss Tools - Maven, Gradle, Ant & mehr 2
S Maven Arquillian braucht fast eine Minute für ein Deployment Tools - Maven, Gradle, Ant & mehr 5
G Maven Tomcat und Web Deployment Assembly Tools - Maven, Gradle, Ant & mehr 10
Guybrush Threepwood Deployment auf Mac: Update von App Bundles Tools - Maven, Gradle, Ant & mehr 3
M Plattformunabhängiges Deployment für simple Zwecke Tools - Maven, Gradle, Ant & mehr 4
D Maven Deployment mit profilabhängigem Dateinamen Tools - Maven, Gradle, Ant & mehr 2
A ProcessBuilder kann nach Deployment File nicht finden Tools - Maven, Gradle, Ant & mehr 4
D artefakt deployment aus m2eclipse heraus? Tools - Maven, Gradle, Ant & mehr 14
M Deployment und Konfiguration mit Tomcat Tools - Maven, Gradle, Ant & mehr 8
G Deployment auf Linux Tools - Maven, Gradle, Ant & mehr 4
D Java Programm veröffentlichen am Besten modular Tools - Maven, Gradle, Ant & mehr 28
R Kalender Applet, wo am besten anfangen? Tools - Maven, Gradle, Ant & mehr 8
V GIT: (bestes) Vorgehen, wenn push fehlschlägt Tools - Maven, Gradle, Ant & mehr 7
G wie soll ich vorgehen? Tools - Maven, Gradle, Ant & mehr 3

Ähnliche Java Themen


Oben