2012-07-22 70 views
1

我对java很陌生,在设置classpath时有一些疑问。 在这个论坛上提问之前,我已经完成了我的家庭作业。试图谷歌搜索和引用其他论坛,但没有找到我正在寻找的 。Java - 使用环境变量引用外部罐子

所以,它就是这样。

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

现在到了主要部分...

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

现在我想做的是..

我想我的应用程序是指环境变量 - XYZ_LIB_PATH拿起所有目前在通过的XYZ_LIB_PATH环境变量指向的目录 的jar文件该平台。 通过这样做,我不必担心在安装应用程序时在每台计算机上查找jar文件。它可以将 查看到XYZ_LIB_PATH变量所指向的目录中,并通过加载所需的jar来继续运行。

这是因为应用程序XYZ是可定制的,每个用户可能已经将它安装在不同的目录中 ,我的应用程序需要找出XYZ安装位置。相反,如果我使用环境变量,通过查看为XYZ_LIB_PATH变量设置的路径,我可以很容易地为我的应用程序获取所需的JAR文件。用户无法更改环境变量 ,因此此变量在所有平台上都保持不变,并且我可以获得罐子的有效路径。

有什么办法可以在java中完成这个任务吗?

感谢, 维奈小号

回答

1

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

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

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

IF NOT DEFINED XYZ_LIB_PATH (ECHO XYZ is NOT installed) 
+0

谢谢Nizet,有道理,够简单.. :) – 2012-07-22 15:08:00

1

看一看这个代码,我发现谷歌,它应该解释如何动态地加载罐:

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")); 
+0

感谢您的意见和反应,Diddiz:

如果需要的话,如果XYZ_LIB_PATH环境变量设置和正常退出,如果不是这个脚本可以检测。 – 2012-07-22 16:37:48