Thomas Darimont
Erfahrenes Mitglied
Hallo!
Beispielszenario:
Wir haben ein jar namens superswt.jar mit dem folgenden Aufbau:
superswt.jar/swt-win32-3063.dll
superswt.jar/META-INF/Manifest.mf
superswt.jar/lib/swt.jar
superswt.jar/de/tutorials/SWTExample.class
SWTExample.jar
Das "Geheimnis" besteht darin den aktuellen ContextClassLoader auf einen neuen ClassLoader zu setzen welcher Zugriff auf unser "jar im jar" hat.
Mit dem Kommando java -jar superswt.jar führen wir das ganze dann aus.l
(Beispiel stammt aus http://www.tutorials.de/tutorials207869.html )
Gruß Tom
Beispielszenario:
Wir haben ein jar namens superswt.jar mit dem folgenden Aufbau:
superswt.jar/swt-win32-3063.dll
superswt.jar/META-INF/Manifest.mf
superswt.jar/lib/swt.jar
superswt.jar/de/tutorials/SWTExample.class
SWTExample.jar
Code:
/*
* Created on 06.06.2005@13:46:36
*
* TODO Some Licence info...
*/
package de.tutorials;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.URL;
import java.net.URLClassLoader;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
/**
* @author TDarimont
*
* TODO Explain me
*/
public class SWTExample {
public static void main(String[] args) throws Exception {
final String SWT_DLL_FILENAME = "swt-win32-3063.dll";
final File file = new File(SWT_DLL_FILENAME);
ClassLoader cl = SWTExample.class.getClassLoader();
URL url = cl.getResource("lib/swt.jar");
URLClassLoader ucl = new URLClassLoader(new URL[]{url},cl);
Thread.currentThread().setContextClassLoader(ucl);
if (!file.exists()) {
InputStream is = SWTExample.class.getClassLoader()
.getResourceAsStream(SWT_DLL_FILENAME);
FileOutputStream fos = new FileOutputStream(file);
byte[] buffer = new byte[1024];
int len = 0;
while ((len = is.read(buffer)) >= 0) {
fos.write(buffer, 0, len);
}
is.close();
fos.flush();
fos.close();
}
Display display = new Display();
Shell shell = new Shell(display);
shell.setText("SWTExample");
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
//Try to delete swt-lib...
file.delete();
//Oder
// Runtime.getRuntime().addShutdownHook(new Thread(){
// public void run(){
// file.delete();
// }
// });
}
}
Das "Geheimnis" besteht darin den aktuellen ContextClassLoader auf einen neuen ClassLoader zu setzen welcher Zugriff auf unser "jar im jar" hat.
Mit dem Kommando java -jar superswt.jar führen wir das ganze dann aus.l
(Beispiel stammt aus http://www.tutorials.de/tutorials207869.html )
Gruß Tom