Простой способ - убедиться, что зависимые файлы JAR находятся в пути к классам, перед запуском программы.
Если вы хотите загрузить из подкаталога, вам нужно определить путь к JAR-файлу, который нужно указать URLClassLoader. Вы можете использовать что-то вроде этого, чтобы получить путь к вашей программе:
new File(MyClass.class.getProtectionDomain().getCodeSource().getLocation().toURI().getPath())
Это что-то вроде хака, но я не знаю ни одного официального способа получить путь к Java-программе.
Если вы хотите динамически загрузить JAR, чтобы вы могли использовать его так, как если бы вы указали его в пути к классам, проверьте этот поток . Это определенно относится к сфере неподдерживаемого взлома, но это также просто и легко.
Модифицированная версия, которую я использую:
import java.io.File;
import java.lang.reflect.Method;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
/**
* Hack to modify classpath at runtime. Can be used to load JARs as if they were
* loaded from the start.
*
* Warning: May break if URLClassLoader changes
*
* @author Antony Miguel
*/
public class ClasspathHacker {
/**
* Add a file to the classpath.
*
* @param pPath
* path to the file
*/
public static void addFile(String pPath) {
File f = new File(pPath);
addFile(f);
}
/**
* Add a file to the classpath.
*
* @param pFile
* the file to be added
*/
public static void addFile(File pFile) {
try {
addURL(pFile.toURI().toURL());
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
/**
* Add the content pointed to by a URL to the classpath.
*
* @param pURL
* the URL pointing to the content to be added
*/
public static void addURL(URL pURL) {
/*
* Use reflection to call addURL on the system classloader, which we
* expect to be a URLClassLoader
*/
Method method;
try {
method = URLClassLoader.class.getDeclaredMethod("addURL",
new Class[] { URL.class });
method.setAccessible(true);
method.invoke(ClassLoader.getSystemClassLoader(),
new Object[] { pURL });
} catch (Exception e) {
e.printStackTrace();
}
}
}