문제

JAR 파일과 두 개의 DLL 파일이 포함 된 타사 Java 라이브러리를 구입했습니다. 나는 제 3 자 JAR 파일을 호출하는 나만의 Java 프로그램을 썼습니다. 이제 내 질문입니다 내 모든 코드를 모든 코드와 타사 JAR 및 DLL을 포함하는 단일 JAR 파일로 어떻게 패키지하려면 어떻게해야합니까?

알아요 SWT 그런 경우입니다. 그만큼 swt.jar DLL 파일이 포함되어 있지만이 작업을 수행하는 방법과 제대로 작동하는 방법을 모르겠습니다.

도움이 되었습니까?

해결책

항아리의 어느 곳에도 포장하십시오. 그래도 명심해야 할 한 가지 - DLL을 사용하기 전에 실제로 항아리에서 이것을 추출하고 하드 디스크에 버려야합니다. 그렇지 않으면 하드 디스크에 버려야합니다.

그래서 기본적으로 - 전쟁 내에서 포장 된 항아리를 사용할 고객을 위해 JNI 프로젝트를 수행했습니다. 그러나 기본 메소드를 실행하기 전에 DLL을 리소스로 가져 와서 디스크에 Temp 디렉토리에 작성합니다. 그런 다음 DLL이 방금 DLL을 쓴 동일한 위치로 설정된 정기 초기화 코드를 실행합니다.

아, 그리고 만일 경우 : DLL 또는 다른 파일을 JAR에 포장하는 데 특별한 것은 없습니다. 물건을 포장하는 것과 같습니다

방금 파헤쳐 놓은 코드가 있습니다

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 다른 항아리에서 무제한 둥지로 DLL과 항아리를로드 할 수 있습니다. 예를 들어, DLL은 다른 루트 항아리에있는 항아리에있을 수 있습니다. 모든 DLL과 항아리는 클래스 경로 또는 라이브러리 경로에있는 것처럼로드됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top