簡體   English   中英

從自己的 Jar 項目調用 Jar 庫?

[英]Call a Jar Library from Own Jar Project?

我用 java 編寫了一個應用程序並將其轉換為執行 jar 文件,我的項目依賴於“jxl.jar”。 有沒有辦法將“jxl.jar”復制到我的 jar 文件中,然后調用它。

我認為這叫做“嵌套罐子”???

非常感謝

此致,

麥克風

最簡單的方法是解壓縮jxl.jar並將其與 class 文件一起打包到單個 jar 中。

您也可以將jxl.jar放入 jar 中,使用JarClassLoader加載它並使用反射調用,但這可能不值得付出努力並增加了復雜性。

這應該看起來像這樣:

import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;

public class Preloader
{
    public static void main(String[] args) throws Exception
    {

        Class<Preloader> c= Preloader.class;

        URLClassLoader loader = new URLClassLoader(new URL[]{
            c.getResource("program.jar"),
            c.getResource("library.jar")});

        Class<?> main_class=loader.loadClass("Main");
        Method main_method = main_class.getMethod("main", args.getClass());
        main_method.invoke(null, new Object[]{args});

    }
}

不幸的是,它不適用於嵌套的 jars。 URLClassLoader有問題。 您可以將嵌套的 jars 提取到臨時文件並將它們傳遞給 URLClassLoader。 您還可以使用此處描述的自定義URLStreamHandler ,它甚至可能是一個有效的解決方案。

不能嵌套 jars。 But you may put the jxl.jar next to your jar, and add this jar as a classpath entry in the manifest of your jar:

Class-Path: jxl.jar

閱讀http://download.oracle.com/javase/tutorial/deployment/jar/downman.html了解詳情。

如果您的項目不使用同一庫的多個版本,您可以按照 Banthar 的說明進行操作,在 jar 文件中提取 lib jar,然后重新打包所有內容。

由於 jar 文件是 zip 文件,您可以使用您喜歡的文件壓縮軟件,並將 jxl.jar 中的類復制到您的文件中。 您也可以使用 jar 命令:

提取 jxl.jar 的內容

jar xf jxl.jar

將內容復制到 output 目錄(與項目的編譯類一起)。 重新包裝一切:

jar cf my.jar my-build-directory

另一種選擇是使用jarjar 除了將一個 jar 嵌入另一個之外,jarjar 還可以讓您擁有同一個庫的多個版本(在不同的名稱空間中)。 您可以將它與Ant從 CLI一起使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM