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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top