세 번째 라이브러리 객체를 전달할 때 Netbeans 플랫폼 LinkageError가 발생했습니다.
-
21-12-2019 - |
문제
안녕하세요 Netbeans 플랫폼의 모듈 설계에 문제가 있습니다.
내 예에서는 문제를 설명합니다.
내 프로젝트:
Test-API (API module)
SP1 (ServiceProvider interface)
SP2 (ServiceProvider interface)
Test-Module1
SP1Impl (ServiceProvider class implements SP1)
Test-Module2
SP2Impl (ServiceProvider class implements SP2)
Test-Module3
TestAction
SP1:
package linkagetest.api;
import org.jdom2.Element;
public interface SP1 {
public Element create();
}
SP2:
package linkagetest.api;
import org.jdom2.Element;
public interface SP2 {
public void doStuff(Element element);
}
SP1구현:
package linkagetest.mod1;
import linkagetest.api.SP1;
import org.jdom2.Element;
import org.openide.util.lookup.ServiceProvider;
@ServiceProvider(service = SP1.class)
public class SP1Impl implements SP1 {
@Override
public Element create() {
return new Element("BLA");
}
}
SP2Impl:
package linkagetest.mod2;
import linkagetest.api.SP2;
import org.jdom2.Element;
import org.openide.util.lookup.ServiceProvider;
@ServiceProvider(service = SP2.class)
public class SP2Impl implements SP2 {
@Override
public void doStuff(Element element) {
element.addContent(new Element("BLA"));
}
}
테스트작업:
package linkagetest.mod3;
import linkagetest.api.SP1;
import linkagetest.api.SP2;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import org.openide.awt.ActionID;
import org.openide.awt.ActionReference;
import org.openide.awt.ActionRegistration;
import org.openide.util.Lookup;
import org.openide.util.NbBundle.Messages;
@ActionID(category = "File", id = "linkagetest.mod3.TestAction")
@ActionRegistration(displayName = "#CTL_TEST")
@ActionReference(path = "Menu/File", position = 1300)
@Messages("CTL_TEST=TEST")
public final class TestAction implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
SP1 sp1 = Lookup.getDefault().lookup(SP1.class);
SP2 sp2 = Lookup.getDefault().lookup(SP2.class);
// and this is where the linkage fails
sp2.doStuff(sp1.create());
}
}
나는 얻다:
java.lang.LinkageError: loader constraint violation: loader (instance of org/netbeans/StandardModule$OneModuleClassLoader) previously initiated loading for a different type with name "org/jdom2/Element"
이유를 이해합니다 org.jdom2.Element
Module1과 Module2의 동일한 클래스 인스턴스가 아니지만 LinkageError가 발생하지 않고 이러한 계층 구조를 어떻게 디자인해야 합니까?객체를 어떻게 전달할 수 있나요?
해결책
알았어, 알아냈어.하나의 모듈로만 lib를 제공하고 패키지를 공개로 선언해야 합니다.
그래서 pom.xml
~의 Test-API
모듈에 공개 패키지를 추가했습니다.
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>nbm-maven-plugin</artifactId>
<extensions>true</extensions>
<configuration>
<publicPackages>
<publicPackage>linkagetest.api</publicPackage>
<publicPackage>org.jdom2</publicPackage>
</publicPackages>
</configuration>
</plugin>
...
제휴하지 않습니다 StackOverflow