Program Tip

DLL 파일을 포함하는 JAR 파일을 만드는 방법은 무엇입니까?

programtip 2020. 11. 15. 11:38
반응형

DLL 파일을 포함하는 JAR 파일을 만드는 방법은 무엇입니까?


JAR 파일과 두 개의 DLL 파일이 포함 된 타사 Java 라이브러리를 구입했습니다. 타사 JAR 파일을 호출하는 자체 Java 프로그램을 작성했습니다. 이제 내 질문은 내 모든 코드와 타사 JAR 및 DLL을 포함하는 단일 JAR 파일로 모든 코드를 패키징하는 방법입니다.

나는 SWT 가 그런 경우 라는 것을 안다 . swt.jardll 파일 포함되어 있지만이 작업을 수행하는 방법과 제대로 작동하는 방법을 모르겠습니다.


항아리의 아무 곳에 나 포장하십시오. 하지만 명심해야 할 한 가지는 DLL을 사용하기 전에 실제로 JAR에서 이러한 DLL을 추출하여 하드 디스크 어딘가에 덤프해야합니다. 그렇지 않으면로드 할 수 없습니다.

그래서 기본적으로-전쟁에서 패키징 된 항아리를 사용할 클라이언트를 위해 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
}

무제한 중첩으로 다른 JAR에서 DLL 및 JAR을로드 할 수있는 http://www.jdotsoft.com/JarClassLoader.php사용 하십시오 . 예를 들어 DLL은 다른 루트 JAR에있는 JAR에있을 수 있습니다. 모든 DLL 및 JAR은 클래스 경로 또는 라이브러리 경로에있는 것처럼로드됩니다.

참고URL : https://stackoverflow.com/questions/1611357/how-to-make-a-jar-file-that-includes-dll-files

반응형