JARファイルと2つのDLLファイルを含むサードパーティのJavaライブラリを購入しました。サードパーティのJARファイルを呼び出す独自のJavaプログラムを作成しました。今私の質問は、すべてのコードとサードパーティのJARおよびDLLを含む単一のJARファイルにすべてのコードをパッケージ化するにはどうすればよいですか?
私はSWTがそのようなケースであることを知っています。include dllファイルがありますが、これswt.jar
を行う方法と正しく機能させる方法がわかりません。
瓶の中のどこかにそれをパッケージするだけです。ただし、注意しなければならないことが1つあります。DLLを使用する前に、実際にJARからこれらを抽出し、ハードディスクのどこかにダンプする必要があります。そうしないと、これらをロードできません。
つまり、基本的には、戦争中にパッケージ化されたそのようなjarを使用するクライアントのためにJNIプロジェクトを実行しました。ただし、ネイティブメソッドを実行する前に、DLLをリソースとして取得し、ディスクの一時ディレクトリに書き込みます。次に、DLLを書き込んだ場所と同じ場所にDLLが設定されている通常の初期化コードを実行します。
念のために言っておきますが、dllやその他のファイルをjarにパッケージ化することについて特別なことは何もありません。ものをzipにパッケージ化するようなものです
これが私が掘り出したばかりのコードです
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
}
http://www.jdotsoft.com/JarClassLoader.phpを使用すると、別の JAR から無制限のネスティングで DLL と JAR をロードできます。たとえば、DLL は、別のルート JAR にある JAR にある可能性があります。すべての DLL と JAR は、クラスパスまたはライブラリ パスにあるかのようにロードされます。