Пытаюсь это сделать уже несколько дней и не могу заставить его работать!
Я пытаюсь создать подключаемое Java-приложение, в котором я могу запустить его из командной строки и предоставить плагины (jars) в отдельной папке. Кажется, что ServiceLoader
соответствует моему требованию, но я думаю, что мне нужен особый случай, когда банки не являются частью пути к классам, тогда как они хранятся в другом месте, и по этой причине мне нужно будет использовать ClassLoder
, указывающий его URL-адрес на этот путь к файловой системе.
Один из плагинов, который я хочу предоставить основному приложению, — это log jar с некоторыми пользовательскими функциями.
Ниже приведен код, который я использую, но не могу войти в цикл 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);
}
}
- Структура
=================
Скорректировал структуру проекта следующим образом, но все еще не работает: