نيتبانز منصة لينكاجيرور عند تمرير كائن مكتبة 3

StackOverflow https://stackoverflow.com//questions/22034735

  •  21-12-2019
  •  | 
  •  

سؤال

مرحبا لدي مشاكل مع تصميم وحدة في منصة نيتبانز.

يوضح المثال الخاص بي المشكلة:

مشاريعي:

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

البرنامج الفرعي 1:

package linkagetest.api;

import org.jdom2.Element;

public interface SP1 {
  public Element create();
}

2:

package linkagetest.api;

import org.jdom2.Element;

public interface SP2 {
  public void doStuff(Element element);
}

سب1مبل:

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");
  }
}

سب2مبل:

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 ليس نفس مثيل الفئة في الوحدة النمطية 1 والوحدة النمطية 2, ولكن كيف يفترض بي تصميم مثل هذا التسلسل الهرمي دون الحصول على لينكاجيرور?كيف يمكنني تمرير الكائن?

هل كانت مفيدة؟

المحلول

حسنا ، لقد اكتشفت ذلك.يجب أن أقدم ليب فقط من قبل وحدة واحدة وتعلن حزم كما العامة.

حتى في 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>
  ...
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top