# Was muss alles in die Manifest.mf?



## HuberDe (12. Oktober 2007)

Hallo zusammen,

ich habe durch jface und jdom sehr viele jars integriert. Muss ich diese nun auch alle in die Manifest.mf in den Class-Path: aufnehmen? Wenn ich das nämlich mache, meldet mir Eclipse: "line too long".

Und muss ich ressourcen wie images und language Files auch in die Manifest aufnehmen? Wenn ja, wie?

Gibt es irgendwo ein gutes tutorial wo ich mir das anschauen kann?

Danke


----------



## Tobias Köhler (12. Oktober 2007)

Wieso hast du denn soviele Jars zum Einbinden? JFace und JDOM sind 2...
Es gab in letzter Zeit viele ähnliche Fragen, such einfach mal nach Manifest oder jar erstellen und ähnliches.


----------



## HuberDe (12. Oktober 2007)

lib/jaxen-core.jar; 
lib/jaxen-jdom.jar;
lib/jdom.jar; 
lib/org.eclipse.core.boot_3.1.100.v20060603.jar o; 
lib/rg.eclipse.core.commands_3.2.0.I20060605-1400.jar; 
lib/org.eclipse.core.jobs_3.2.0.v20060603.jar; 
lib/org.eclipse.core.runtime_3.2.0.v20060603.jar; 
lib/org.eclipse.equinox.common_3.2.0.v20060603.jar; 
lib/org.eclipse.equinox.registry_3.2.0.v20060601.jar; 
lib/org.eclipse.jface.databinding_1.0.0.I20060605-1400.jar; 
lib/org.eclipse.jface.text_3.2.0.v20060605-1400.jar; 
lib/org.eclipse.jface_3.2.0.I20060605-1400.jar; 
lib/org.eclipse.osgi_3.2.0.v20060601.jar

Naja mit nur zwei hat es leider nicht funktioniert. Ich habe dann hier im forum erfahren, dass da noch einiges mehr dazu muss.


----------



## HuberDe (12. Oktober 2007)

Also ich komme nicht weiter. Wenn ich die ganzen jars in die manifest.mf in Class-path: eintrage sagt mir Eclipse "line too long". Wenn ich sie weglasse, kommt beim Starten der Applikation "Could not find the main class. Program will exit". Ich weiß mir nicht mehr zu helfen! Die Suche brachte mich leider auch nicht weiter.


----------



## zerix (12. Oktober 2007)

Hallo,

Vielleicht solltest du dein Manifest-File mal posten. 

MFG

zEriX


----------



## HuberDe (12. Oktober 2007)

Wäre eventuell sinnvoll ;-)

So sagt Eclipse "line too long"


```
Manifest-Version: 1.0
Main-Class: mta.xtde.Xtde
Class-Path: lib/swt.jar lib/jaxen-core.jar lib/jaxen-jdom.jar lib/jdom.jar lib/org.eclipse.core.boot_3.1.100.v20060603.jar o lib/rg.eclipse.core.commands_3.2.0.I20060605-1400.jar lib/org.eclipse.core.jobs_3.2.0.v20060603.jar lib/org.eclipse.core.runtime_3.2.0.v20060603.jar lib/org.eclipse.equinox.common_3.2.0.v20060603.jar lib/org.eclipse.equinox.registry_3.2.0.v20060601.jar lib/org.eclipse.jface.databinding_1.0.0.I20060605-1400.jar lib/org.eclipse.jface.text_3.2.0.v20060605-1400.jar lib/org.eclipse.jface_3.2.0.I20060605-1400.jar lib/org.eclipse.osgi_3.2.0.v20060601.jar
```

Und so kommt beim ausführen des Jar: "Could not find main class. Program will exit"


```
Manifest-Version: 1.0
Main-Class: mta.xtde.Xtde
Class-Path: lib/swt.jar
```


----------



## zerix (12. Oktober 2007)

Mach doch einfach mal einen Zeilenumbruch rein.

MFG

zEriX


----------



## HuberDe (12. Oktober 2007)

dann bekomme ich die Meldung "invalid header field"

Grundsätzlich ist es aber auch schon richtig dass ich die ganzen jars hier eintragen muss!?


----------



## zerix (12. Oktober 2007)

Ja, das ist schon richtig. 

MFG

zEriX


----------



## HuberDe (12. Oktober 2007)

Also wenn ich die Zeilen aufteile und jedesmal Class-Path: davorschreibe schluckt er es. Aber ich habe das Gefühl er überschreibt dann jedesmal

Wenn ich nur diesen Class-Path setze


```
Class-Path: lib/swt.jar lib/org.eclipse.jface_3.2.0.I20060605-1400.jar lib/org.eclipse.osgi_3.2.0.v20060601.jar
```

kommt kein Fehler beim Ausführen des Jar. Aber es passiert auch nichts. Ich sehe mein Widget nicht.


----------



## HuberDe (12. Oktober 2007)

Warum trägt eclipse diesen Class-Path eigentlich nicht richtig ein!? Im Projekt muss ich doch im Build path genau diese Abhängigkeiten angeben!?


----------



## Kulabac (12. Oktober 2007)

Nur mal so als Idee: 
Vielleicht klappt das mit dem mehrzeiligen Classpath, wenn du neue Zeilen mit einer Leerzeile beginnst. Hab ich aber nie ausprobiert (Kenn ich aber von den Manifest-Dateien aus OSGi-Bundles, dort müssten die verschieden Werte aber sogar noch durch Komma getrennt werden...).

Also z.B.

```
Class-Path: lib/swt.jar lib/org.eclipse.jface_3.2.0.I20060605-1400.jar 
 lib/org.eclipse.osgi_3.2.0.v20060601.jar
```


----------



## HuberDe (12. Oktober 2007)

Deine Idee war Gold wert ;-) Das ist der Rätsels Lösung.

Jetzt habe ich dennoch weiterhin das Problem, dass beim starten des JARs keine Fehlermeldung ausgegeben wird. Ich starte die Datei über die kommandozeile. Es kommt kein Fehler und die Eingabeaufforderung wird wieder angezeigt.

Damit bin ich am gleichen Punkt wie als ich ein großes JAR mit FatJar erzeugt habe. Da es mit Fatjar nicht geklappt hat, ging ich den Weg über den Jar Export von Eclipse.

Jemand eine Idee warum das so ist?


----------



## HuberDe (12. Oktober 2007)

Ich konnte das Problem eingrenzen. Es scheint am Code zu liegen. Ich habe in meiner Main folgenden Aufruf:


```
private void createSShell()
{

	resource = Resource.getInstance();
...
```

Resource.java sieht folgendermaßen aus:


```
import org.eclipse.jface.resource.ColorRegistry;
import org.eclipse.jface.resource.ImageRegistry;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.widgets.Display;

public class Resource
{
	//	For a singleton instance
	private static Resource instance = null;
	public ColorRegistry colorRegistry = null;
	public ImageRegistry imageRegistry = null;
	
	protected Resource()
	{
		colorRegistry = new ColorRegistry();
		imageRegistry = new ImageRegistry();
		
		addImages();
		addColors();
	}
	
	public static Resource getInstance()
	{
		if (instance == null)
		{
			instance = new Resource();
		}
		return instance;
	}
	
	private void addImages()
	{
		Display display = Display.getDefault();
		
		imageRegistry.put("Bild", new Image(display, getClass().getResourceAsStream("/images/blue.ico")));
	}
	
	private void addColors()
	{
		colorRegistry.put("blue", new RGB(0,39,159));
		colorRegistry.put("green", new RGB(102,204,51));
		colorRegistry.put("orange", new RGB(0253,153,0));
	}
}
```

Im Projektordner liegt ein Verzeichnis "images" mit dem Inhalt "blue.ico".

Wenn ich die Codestelle "*resource = Resource.getInstance();*" rausnehme, startet die .jar. Wenn nicht passiert garnichts, wenn ich draufklicke.


----------



## Kulabac (12. Oktober 2007)

Hmm, mit anderen Worten er findet das Icon nicht? Da muss ich auch ab und zu mit kämpfen - also so Sachen aus Jar-Files zu laden ist leider nicht so leicht wie direkt aus der Verzeichnisstruktur. Mit getResourceAsStream verwendest du aber eigentlich schon die genau richtige Methode. Vielleicht probierst du das mal über die Klasse und nicht über die Instanz. Also statt 

```
getClass().getResourceAsStream("/images/blue.ico")
```
lieber 

```
Resource.class.getResourceAsStream("/images/blue.ico")
```
Ist aber auch wieder nur geraten ... bei so Jar-Files muss ich meistens was rumprobieren, bis es richtig geht.


----------

