[英]How to add external jar library with Maven, with the possibility of following full(with external jar inside) packaging?
[英]Load an external library inside a jar
我有一個動態加載的 jar 文件,里面有我在 main 中使用的 lib/另一個 jar(外部庫)(import it.xxx.xx)。 如何在類路徑中動態加載這個外部庫? 我的代碼不起作用:
public static void runOne(String jar, String class_name, Optional<String> test_name,
TestExecutionListener listener) throws Exception {
Launcher launcher = LauncherFactory.create();
ClassLoader loader = URLClassLoader.newInstance(
new URL[] { new File(pathJars+"/"+jar).toURI().toURL() },
ServiceUtil.class.getClassLoader()
);
loader.getClass();
addURL(loader); <--here i want add a jar to classpath!
Class cls=loader.loadClass(class_name);
Constructor constructor = cls.getConstructor();
constructor.newInstance();
LauncherDiscoveryRequest request;
if (test_name.isPresent()) {
Method m = cls.getMethod(test_name.get());
request = LauncherDiscoveryRequestBuilder.request()
.selectors(selectMethod(cls,m))
.build();
}
else{
request = LauncherDiscoveryRequestBuilder.request()
.selectors(selectClass(cls))
.build();
}
TestPlan testPlan = launcher.discover(request);
launcher.registerTestExecutionListeners(listener);
launcher.execute(request);
//launcher.execute(request);
loader=null;
System.gc();
}
public static void addURL(ClassLoader loader) throws IOException {
URL u=loader.getResource("lib/sem-platform-sdk-1.0-SNAPSHOT.jar");
Class[] parameters = new Class[]{URL.class};
URLClassLoader sysloader = (URLClassLoader) ClassLoader.getSystemClassLoader();
Class sysclass = URLClassLoader.class;
try {
Method method = sysclass.getDeclaredMethod("addURL", parameters);
method.setAccessible(true);
method.invoke(sysloader, new Object[]{u});
} catch (Throwable t) {
t.printStackTrace();
throw new IOException("Error, could not add URL to system classloader");
}//end try catch
}//end method
謝謝
這通常是通過構建工具(例如 maven 或 gradle)完成的。 我不知道您是否正在使用其中之一。 他們讓生活變得更輕松。
我們使用 Maven 和 Apache Shade 插件來做到這一點。 Maven 具有自動為您設置配置的命令,然后您將 Shade 插件添加到生成的配置文件 (pom.xml) 中。
https://maven.apache.org/plugins/maven-shade-plugin/index.html
如果我正確理解您的問題,您希望從 jar 文件加載的類能夠訪問嵌套 jar 文件中的類。 您可以通過創建一個 ClassLoader 來實現這一點,其中一個條目用於 jar 文件,另一個條目用於嵌套的 jar 文件。
Java 有一個特殊的 URL 方案jar:
,用於直接引用 jar 條目。 (這個方案和語法在JarURLConnection 的文檔中有描述。)所以你可以這樣構造你的類加載器:
URL jarURL = new File(pathJars+"/"+jar).toURI().toURL();
URL semURL = new URL("jar:" + jarURL + "!/"
+ "lib/sem-platform-sdk-1.0-SNAPSHOT.jar");
ClassLoader loader = URLClassLoader.newInstance(
new URL[] { jarURL, semURL },
ServiceUtil.class.getClassLoader()
);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.