【发布时间】:2016-10-27 12:18:13
【问题描述】:
这几天一直在尝试,但无法正常工作!
我正在尝试构建一个可插入的 Java 应用程序,我可以在其中从命令行运行它并在单独的文件夹中提供插件(jar)。 ServiceLoader 似乎符合我的要求,但我认为我需要一个特殊情况,即 jar 不是类路径的一部分,而它们存储在不同的位置,因此我需要使用 ClassLoder 指向它指向此文件系统路径的 url。
我想提供给主应用程序的插件之一是一个带有一些自定义功能的日志罐。
下面是我正在使用的代码,但无法进入 for/loop .. 这意味着 ServiceLoader 无法识别/匹配任何类实现:
final URL u = new File("C:\\data\\myLogJar-1.0-SNAPSHOT.jar").toURI().toURL();
ClassLoader ucl = new URLClassLoader(new URL[] {u});
ServiceLoader<Log> loader = ServiceLoader.load(Log.class, ucl);
for (Iterator<Log> iterator = loader.iterator(); iterator.hasNext(); ) {
System.out.println(iterator.next());
}
loader = ServiceLoader.load(Log.class,ucl);
for (final Log log : loader) {
log.info("Test log");
}
希望你能帮上忙! 非常感谢
==== 添加项目文件:
主要的可插拔应用程序:
package com.company.dep.automation;
import com.company.dep.automation.pluggable.Log;
import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.*;
public class Main {
private static ServiceLoader<Log> serviceLoader;
public static void main(String[] args) {
final URL u;
ClassLoader ucl = null;
try {
u = new File("C:\\data\\myLogJar-1.0-SNAPSHOT.jar").toURI().toURL();
ucl = new URLClassLoader(new URL[]{u});
} catch (MalformedURLException e1) {
e1.printStackTrace();
}
ServiceLoader<Log> loader = ServiceLoader.load(Log.class, ucl);
for (Iterator<Log> iterator = loader.iterator(); iterator.hasNext(); ) {
System.out.println(iterator.next());
}
loader = ServiceLoader.load(Log.class, ucl);
for (final Log log : loader) {
log.info("Test log");
}
}
}
“日志”插件
接口Log
package com.company.automation.service;
public interface Log {
void trace(String message);
void debug(String message);
void info(String message);
void warn(String message);
void severe(String message);
void error(String message);
void fatal(String message);
}
它的实现
package com.company.automation.service.impl;
import com.company.automation.service.Log;
public class LogImpl implements Log {
@Override
public void trace(String message) {
log("TRACE --> " + message);
}
@Override
public void debug(String message) {
log("DEBUG --> " + message);
}
@Override
public void info(String message) {
log("INFO --> " + message);
}
@Override
public void warn(String message) {
log("WARN --> " + message);
}
@Override
public void severe(String message) {
log("SEVERE --> " + message);
}
@Override
public void error(String message) {
log("ERROR --> " + message);
}
@Override
public void fatal(String message) {
log("FATAL --> " + message);
}
private void log(String message) {
System.out.println(message);
}
}
- 结构
==================
将项目结构调整如下,但还是不行:
【问题讨论】:
-
请显示你的jar文件的结构
-
对不起!添加更多信息...
-
如果您至少有一个结果,因为您没有调用 next(),您的第一个循环将永远循环
-
是的 .. 我做了很多尝试,可能会留下错误 - 第二个块无论如何都不会循环.. 感谢您指出它
标签: java urlclassloader serviceloader pluggable