首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java -使用环境变量引用外部jars

问Java -使用环境变量引用外部jars
EN

Stack Overflow用户
提问于 2012-07-22 14:22:20
回答 2查看 896关注 0票数 1

我对java非常陌生,在设置类路径方面也有一些疑问。在这个论坛上问问题之前,我已经做了家务活。试着搜索并引用其他论坛,但没有找到我正在搜索的内容。

所以,它开始了。

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

现在是主要的部分..。

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

现在我想做的是..。

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

这背后的原因是-由于应用程序XYZ是可定制的,每个用户都可能在不同的目录中安装了XYZ,我的应用程序需要知道XYZ是在哪里安装的。相反,如果我使用环境变量,通过查看XYZ_LIB_PATH变量的路径集,我可以轻松地为我的应用程序获得所需的jars。用户不能更改环境变量,因此这个变量在所有平台上都保持不变,我可以为jars获得一个有效的路径。

有什么方法可以在java中实现这一点吗?

谢谢,维奈·S

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-22 14:37:48

只需为您的应用程序提供一个启动脚本:

代码语言:javascript
复制
java -cp myApp.jar;%XYZ_LIB_PATH%\* com.foo.bar.MyApp

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

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

代码语言:javascript
复制
IF NOT DEFINED XYZ_LIB_PATH (ECHO XYZ is NOT installed)
票数 1
EN

Stack Overflow用户

发布于 2012-07-22 14:31:55

看看我在google中找到的这段代码,它应该解释如何动态加载jars:

代码语言:javascript
复制
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:

代码语言:javascript
复制
addJarsToClassPath(Thread.currentThread().getContextClassLoader(), new File(System.getenv("XYZ_LIB_PATH"), "library.jar"));
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11601060

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档