Java - 使用环境变量引用外部jar

时间:2012-07-22 14:22:21

标签: java classpath

我对java很新,并且在设置类路径方面有一些疑问。 在这个论坛上提问之前,我已完成了自己的家庭作业。尝试谷歌搜索并提到其他论坛,但没有找到 我在寻找什么。

所以,就在这里。

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

    1. XYZ应用程序适用于各种平台 - Linux / Windows / Solaris /等。
    2. 可以在安装期间自定义XYZ以安装到自定义目录。 说 - D:/ XYZ,或D:/ apps / XYZ在Windows,/ apps / XYZ或/ apps / admin / XYZ在linux,solaris等。
    3. 安装XYZ应用程序后,jar文件将出现在安装了XYZ的目录/ jars中。 例如 - * nix中的D:/ XYZ / jars,/ apps / XYZ / jars。
    4. 当应用程序XYZ安装在任何平台上时,会创建并指向新的环境变量XYZ_LIB_PATH 罐子所在的相应文件夹 - 例如,当应用程序创建XYZ_LIB_PATH = D:/ XYZ / jars时 XYZ安装在D:/ XYZ。以同样的方式,如果安装了应用程序XYZ,将创建XYZ_LIB_PATH = / apps / XYZ / jars 在linux机器上。
    5. 现在我想做的是......

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

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

      有没有办法在java中实现这个目的?

      谢谢, Vinay S

2 个答案:

答案 0 :(得分:1)

看一下我在google上找到的代码,它应该解释如何动态加载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();
      }

    }
  }
}

编辑: 所以你可以加载jar:

addJarsToClassPath(Thread.currentThread().getContextClassLoader(), new File(System.getenv("XYZ_LIB_PATH"), "library.jar"));

答案 1 :(得分: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)