Wie eine JAR-Datei zu machen, die DLL-Dateien enthält?
Frage
Ich kaufte eine Drittanbieter-Java-Bibliothek, die eine JAR-Datei und zwei DLL-Dateien enthält. Ich schrieb meine eigene Java-Programm, das die Dritt JAR-Datei aufzurufen. Nun meine Frage ist Wie kann ich all meine Codes in eine einzige JAR-Datei verpacken, die sind all meine Code und den Drittanbieter-JAR und DLLs?
Ich weiß SWT ist ein solcher Fall. Die swt.jar
enthält DLL-Dateien, aber ich weiß nicht, wie dies zu tun und wie man es richtig funktioniert.
Lösung
Just verpacken es überall in dem Topf. Eines muss man allerdings im Auge behalten - bevor Sie den DLLs verwenden, können Sie tatsächlich benötigen, um diese zu extrahieren aus der JAR-and-Dump diese auf der Festplatte irgendwo sonst werden Sie nicht in der Lage zu laden, diese
Also im Grunde - ich habe JNI Projekt für die Kunden, wo ich solches Glas im Krieg verpackt verwenden. Aber - bevor alle nativen Methoden ausgeführt würde ich die DLL als Ressource erhalten und es auf die Disc in temp-Verzeichnis schreiben. Dann würde ich regelmäßig Initialisierung Code ausführen, wo mein DLL an die gleiche Stelle gesetzt ich DLL nur schrieb
Oh, und nur für den Fall: Es gibt nichts Besonderes Verpackungs dll oder jede andere Datei in Glas. Es ist wie Sachen in zip Verpackung
Hier ist ein Code, den ich ausgegraben nur aus
public class Foo {
private static final String LIB_BIN = "/lib-bin/";
private final static Log logger = LogFactory.getLog(ACWrapper.class);
private final static String ACWRAPPER = "acwrapper";
private final static String AAMAPI = "aamapi51";
private final static String LIBEAU = "libeay32";
static {
logger.info("Loading DLL");
try {
System.loadLibrary(ACWRAPPER);
logger.info("DLL is loaded from memory");
} catch (UnsatisfiedLinkError e) {
loadFromJar();
}
}
/**
* When packaged into JAR extracts DLLs, places these into
*/
private static void loadFromJar() {
// we need to put both DLLs to temp dir
String path = "AC_" + new Date().getTime();
loadLib(path, ACWRAPPER);
loadLib(path, AAMAPI);
loadLib(path, LIBEAU);
}
/**
* Puts library to temp dir and loads to memory
*/
private static void loadLib(String path, String name) {
name = name + ".dll";
try {
// have to use a stream
InputStream in = ACWrapper.class.getResourceAsStream(LIB_BIN + name);
// always write to different location
File fileOut = new File(System.getProperty("java.io.tmpdir") + "/" + path + LIB_BIN + name);
logger.info("Writing dll to: " + fileOut.getAbsolutePath());
OutputStream out = FileUtils.openOutputStream(fileOut);
IOUtils.copy(in, out);
in.close();
out.close();
System.load(fileOut.toString());
} catch (Exception e) {
throw new ACCoreException("Failed to load required DLL", e);
}
}
// blah-blah - more stuff
}
Andere Tipps
Verwenden Sie http://www.jdotsoft.com/JarClassLoader.php die DLLs laden konnte und JAR-Dateien von einem anderen JAR mit unlimitiert. Zum Beispiel könnte DLL in JAR sein, die in einem anderen Root-JAR ist. Alle DLLs und JAR-Dateien geladen werden, wie sie in einem Classpath oder Bibliothekspfad sind.