я нашел решение, которое очень похоже на Сообщение Macias, но из реального кода.
Основная идея состоит в том, чтобы поместить класс-заглушку в проект «интерфейс», добавить плагин, который будет удалять классы-заглушки во время фазы технологических процессов, сделать проект реализации «зависит от» и создать класс с реальным кодом с помощью тот же пакет и имя класса как заглушка.
Давайте посмотрим SLF4J проект, как, например, вы можете загрузить исходные файлы из http://www.slf4j.org/download.html
Основным проектом является SLF4J-апи, который содержит интерфейсы: Logger, LocationAwareLogger (расширяет Logger), ILoggerFactory и др. Также он содержит LoggerFactory класс (и несколько классов полезности), который используется, например, при создании регистратора:
private static final Logger logger = LoggerFactory.getLogger(SomeClass.class);
Это API-интерфейс «inteface».
Для "реализации" API SLF4J-апи проект содержит осущ пакет с 3 окурка классов: StaticLoggerBinder, StaticMarkerBinder и StaticMDCBinder, какие методы используются в LoggerFactory класса, но в SLF4J-апи проект они бросают UnsupportedException.
Теперь давайте посмотрим на SLF4J-jdk14 проекта, который зависит от SLF4J-апи и содержит только осущ пакет с 3 предыдущих упомянутых классов: StaticLoggerBinder, StaticMarkerBinder и StaticMDCBinder; и JDK14LoggerAdapter, JDK14LoggerFactory, который реализует LocationAwareLogger и ILoggerFactory из SLF4J-апи. Но они не являются заглушками, они имеют реальный код, например StaticLoggerBinder возвращает JDK14LoggerFactory, который производит JDK14LoggerAdapter.
Теперь давайте посмотрим, где волшебство Мавена. Напомним, что проекты «inteface» и «реализация» имеют одинаковые классы StaticLoggerBinder, StaticMarkerBinder и StaticMDCBinder. Посмотрите на SLF4J-апиpom.xml и найти построить тег:
<project>
...
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
...
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<phase>process-classes</phase>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
<configuration>
<tasks>
<echo>Removing slf4j-api's dummy StaticLoggerBinder and StaticMarkerBinder</echo>
<delete dir="target/classes/org/slf4j/impl"/>
</tasks>
</configuration>
</plugin>
</plugins>
</build>
...
</project>
Поскольку SLF4J-jdk14 зависит от SLF4J-апи, SLF4J-апи устроится первым, после чем плагин delete stubs и slf4j-jdk14 Продолжается строительство и помещает фактические классы «реализаций» вместо «заглушек».
Решение SLF4J работает очень плохо в среде OSGi, и даже Ceki допускает, что он не очень модульный. Он застрял, сохраняя обратную совместимость, но для нового дизайна, вероятно, лучше рассмотреть альтернативное решение, такое как DI или поиск службы (например, java.util.ServiceLoader). –
Может ли ссылка с подробной информацией о проблеме с OSGi? – Cherry
Эта тема - лучшее, что я могу найти прямо сейчас. Я посмотрю, смогу ли я найти цитату из Цэки. http://mailman.qos.ch/pipermail/slf4j-dev/2012-October/003714.html –