我对java很新,并且在设置类路径方面有一些疑问。 在这个论坛上提问之前,我已完成了自己的家庭作业。尝试谷歌搜索并提到其他论坛,但没有找到 我在寻找什么。
所以,就在这里。
现在是主要部分......
现在我想做的是......
我想将我的应用程序引用到环境变量 - XYZ_LIB_PATH并获取目录中存在的所有jar文件 由平台的XYZ_LIB_PATH环境变量指出。 通过这样做,我不必担心在安装我的应用程序时在每台机器中查找jar文件。它可以看 进入XYZ_LIB_PATH变量指向的目录,并通过加载所需的jar继续运行。
这背后的原因是 - 由于应用程序XYZ是可自定义的,因此每个用户可能已将其安装在不同的目录中 我的应用程序需要找出XYZ的安装位置。相反,如果我使用环境变量,我可以得到 通过查看为XYZ_LIB_PATH变量设置的路径,可以轻松地为我的应用程序提供jar。用户无法更改 环境变量,因此这个变量在所有平台上保持不变,我可以获得罐子的有效路径。
有没有办法在java中实现这个目的?
谢谢, Vinay S
答案 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)