1

我对java很陌生,对设置类路径有一些疑问。在这个论坛上提问之前,我已经完成了我的家庭作业。尝试谷歌搜索并参考其他论坛,但没有找到我要搜索的内容。

所以,就这样吧。

  1. 我正在开发一个需要外部 jar 才能正常运行的 Java 应用程序。
  2. 当且仅当系统中安装了自定义应用程序“XYZ”时,这些外部 jar 才可用。
  3. 由于许可问题,我不想在我的应用程序中打包 XYZ 应用程序 jar。
  4. 我的应用程序所做的是 - 检查应用程序 XYZ 是否存在于目标主机中,如果可用则运行。否则会记录一个错误,说明运行程序需要 XYZ 并退出。

现在是主要部分......

  1. XYZ 应用程序可用于各种平台 - Linux / Windows / Solaris / 等。
  2. XYZ 可以在安装过程中自定义安装到自定义目录。比如说 - D:/XYZ,或 Windows 中的 D:/apps/XYZ,Linux 中的 /apps/XYZ 或 /apps/admin/XYZ,solaris 等。
  3. 安装 XYZ 应用程序后,jar 文件将出现在安装 XYZ 的目录 /jars 中。例如 - *nix 中的 D:/XYZ/jars、/apps/XYZ/jars。
  4. 当应用程序 XYZ 安装在任何平台上时,会创建一个新的环境变量 XYZ_LIB_PATH 并指向存在 jar 的相应文件夹 - 例如,当应用程序 XYZ 安装到 D 时,会创建 XYZ_LIB_PATH=D:/XYZ/jars: /XYZ。同样,如果应用程序 XYZ 安装在 linux 机器中,则会创建 XYZ_LIB_PATH=/apps/XYZ/jars。

现在我想做的是..

我想将我的应用程序引用到环境变量 - XYZ_LIB_PATH 并获取平台的 XYZ_LIB_PATH 环境变量指向的目录中存在的所有 jar 文件。通过这样做,我不必担心在安装我的应用程序时在每台机器中查找 jar 文件。它可以只查看 XYZ_LIB_PATH 变量指向的目录,并通过加载所需的 jars 继续运行。

这背后的原因是 - 由于应用程序 XYZ 是可定制的,每个用户可能已经将它安装在不同的目录中,我的应用程序需要找出 XYZ 的安装位置。相反,如果我使用环境变量,我可以通过查看为 XYZ_LIB_PATH 变量设置的路径轻松地为我的应用程序获取所需的 jar。用户无法更改环境变量,因此该变量在所有平台上保持不变,我可以获得 jar 的有效路径。

有没有办法在java中完成这个?

谢谢, 维奈小号

4

2 回答 2

1

看看我在谷歌上找到的这段代码,它应该解释如何动态加载 jar:

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

/**
 * @author Thomas.Darimont
 */
public class DynamicClasspathExtensionExample {

  /**
   * @param args
   */
  public static void main(String[] args) {
    try {
      Class.forName("com.google.inject.Injector");
      System.out.println("Found");
    } catch (ClassNotFoundException e) {
     System.out.println(e.getMessage() + " not found...");
    }
    addJarsToClassPath(Thread.currentThread().getContextClassLoader(), new File[]{new File("D:/stuff/google/guice/1.0/guice-1.0.jar")});
    try {
      Class.forName("com.google.inject.Injector");
      System.out.println("Found");
    } catch (ClassNotFoundException e) {
      System.out.println(e.getMessage() + " not found...");
    }
  }

  private static void addJarsToClassPath(File... jars) {
     addJarsToClassPath(Thread.currentThread().getContextClassLoader(), jars);
  }

  private static void addJarsToClassPath(ClassLoader classLoader, File... jars) {
    if (classLoader instanceof URLClassLoader) {
      try {
        Method addUrlMethod = URLClassLoader.class.getDeclaredMethod("addURL", new Class[] { URL.class });
        addUrlMethod.setAccessible(true);
        if (null != addUrlMethod) {
          for (File jar : jars) {
            try {
              addUrlMethod.invoke(classLoader, jar.toURI().toURL());
            } catch (Exception e) {
              e.printStackTrace();
            }
          }
        }
      } catch (Exception e) {
        e.printStackTrace();
      }

    }
  }
}

编辑:所以你可以加载罐子:

addJarsToClassPath(Thread.currentThread().getContextClassLoader(), new File(System.getenv("XYZ_LIB_PATH"), "library.jar"));
于 2012-07-22T14:31:55.120 回答
1

只需为您的应用提供启动脚本:

java -cp myApp.jar;%XYZ_LIB_PATH%\* com.foo.bar.MyApp

(以上示例适用于 Windows。在 Unix 上也可以这样做)。

如果需要,此脚本可以检测是否设置了 XYZ_LIB_PATH 环境变量,如果没有设置,则正常退出:

IF NOT DEFINED XYZ_LIB_PATH (ECHO XYZ is NOT installed)
于 2012-07-22T14:37:48.050 回答