2016-01-04 5 views
0

У меня есть многомодульный проект OSGi maven. Я использую Maven-сборки-плагин, чтобы организовать различные банки в центральную папку, из которой контейнер OSGi будет загружая различные проектные модули:Как работать с несколькими взаимозависимыми модулями maven

расстояние pom.xml

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <artifactId>dist</artifactId> 
    <packaging>jar</packaging> 

    <properties> 
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    </properties> 

    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <version>2.0.2</version> 
       <configuration> 
        <source>1.8</source> 
        <target>1.8</target> 
       </configuration> 
      </plugin> 

      <plugin> 
       <artifactId>maven-assembly-plugin</artifactId> 
       <executions> 
        <execution> 
         <id>distro-assembly</id> 
         <phase>package</phase> 
         <goals> 
          <goal>single</goal> 
         </goals> 
         <configuration> 
          <descriptors> 
           <descriptor>src/main/assembly/bin.xml</descriptor> 
          </descriptors> 
         </configuration> 
        </execution> 
       </executions> 
      </plugin> 
     </plugins> 
    </build> 
    <parent> 
     <groupId>rev</groupId> 
     <artifactId>parent</artifactId> 
     <version>1.0-SNAPSHOT</version> 
    </parent> 
</project> 

Модульные банки попадают в центральную папку, как я желаю. Я, однако, со временем не могу действительно отслеживать, как зависимости модулей связаны друг с другом. Например, определенному модулю может понадобиться запуск другого модуля, прежде чем он сможет выполнить его правильно. Как я могу гарантировать, что перед запуском модуля -B сначала будет запущен модуль -A. Я хотел бы настроить это так, чтобы какой-то код обрабатывал порядок выполнения?

Это ошибка, которую я получаю, когда такой порядок выполнения неверен. Я не думаю, что пакеты установлены.

Exception in thread "main" org.osgi.framework.BundleException: Unable to resolve OSGiDmHelloWorldConsumer [2](R 2.0): missing requirement [OSGiDmHelloWorldConsumer [2](R 2.0)] osgi.wiring.package; (&(osgi.wiring.package=com.bw.osgi.provider.able)(version>=1.0.0)(!(version>=2.0.0))) Unresolved requirements: [[OSGiDmHelloWorldConsumer [2](R 2.0)] osgi.wiring.package; (&(osgi.wiring.package=com.bw.osgi.provider.able)(version>=1.0.0)(!(version>=2.0.0)))] 
    at org.apache.felix.framework.Felix.resolveBundleRevision(Felix.java:4111) 
    at org.apache.felix.framework.Felix.startBundle(Felix.java:2117) 
    at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:998) 
    at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:984) 
    at main.App.initialize(App.java:46) 
    at main.App.main(App.java:22) 

Ниже класс public class App {}, который бросает ошибку:

App

public class App { 

    public static void main(String[] args) throws BundleException, URISyntaxException { 
     App app = new App(); 
     app.initialize(); 
    } 

    private void initialize() throws BundleException, URISyntaxException { 
     Map<String, String> map = new HashMap<String, String>(); 

     // make sure the cache is cleaned 
     map.put(Constants.FRAMEWORK_STORAGE_CLEAN, Constants.FRAMEWORK_STORAGE_CLEAN_ONFIRSTINIT); 

     map.put("ds.showtrace", "true"); 
     map.put("ds.showerrors", "true"); 

     FrameworkFactory frameworkFactory = ServiceLoader.load(FrameworkFactory.class).iterator().next(); 
     Framework framework = frameworkFactory.newFramework(map); 

     System.out.println("Starting OSGi Framework"); 
     framework.init(); 
     loadScrBundle(framework); 

     String baseDir = "/D:/Maven-Assembly-Plugin-MM/dist/target/dist-1.0-SNAPSHOT-bin/plugins/"; 

     framework.getBundleContext().installBundle("file:" + baseDir + "core-1.0.jar"); 
     framework.getBundleContext().installBundle("file:" + baseDir + "clientfile-plugin-1.0-SNAPSHOT.jar"); 
     framework.getBundleContext().installBundle("file:" + baseDir + "dist-1.0-SNAPSHOT.jar"); 

     List<Bundle> bundles = new ArrayList<Bundle>(); 

     for (Bundle bundle : framework.getBundleContext().getBundles()) { 
      bundle.start(); 
      bundles.add(bundle); 

      System.out.println("Bundle Name: " + bundle.getSymbolicName()); 
      System.out.println("Bundle ID: " + bundle.getBundleId()); 
      if (bundle.getRegisteredServices() != null) { 
       for (ServiceReference<?> serviceReference : bundle.getRegisteredServices()) 
        System.out.println("\tRegistered service: " + serviceReference); 
      } 
     } 

     System.out.println("Total Bundles: " + bundles.size()); 
    } 

    private void loadScrBundle(Framework framework) throws URISyntaxException, BundleException { 
     URL url = getClass().getClassLoader().getResource("org/apache/felix/scr/ScrService.class"); 
     if (url == null) 
      throw new RuntimeException("Could not find the class org.apache.felix.scr.ScrService"); 
     String jarPath = url.toURI().getSchemeSpecificPart().replaceAll("!.*", ""); 
     System.out.println("Found declarative services implementation: " + jarPath); 
     framework.getBundleContext().installBundle(jarPath).start(); 
    } 
} 

Как я могу идти о решении этого? Спасибо всем заранее.

UPDATE

Модуля банки получают положенную в центральную папку, как я хочу. Однако я получаю следующую ошибку для всех модулей, кроме модулей felix, когда я пытаюсь запустить проект после вызова mvn clean install, то есть всех модулей из центрального хранилища maven, например org.apache.felix.framework и org.apache.felix.scr запускаются в контейнере OSGi, за исключением тех, что я пишу сам.

Проблема более подробно

я опубликовал очень короткую версию проекта проблемы с более подробно HERE, Maven-Assembly-Plugin-MM. This, OSGi - Simple Hello World with services, это учебник, который я последовал.

Eclipse:
Import> Существующие Maven Проекты> C: \ *** Путь *** \ Maven-сборочно-Plugin-MM

+0

вы используете обычный ванильный Felix или Karaf? Если вы находитесь на Karaf, посмотрите на [средство развертывания функции] (https://karaf.apache.org/manual/latest/users-guide/provisioning.html). И [karaf-maven-plugin] (https://karaf.apache.org/manual/latest/developers-guide/karaf-maven-plugin.html) для создания файла функций на основе ваших зависимостей POM. – Ralf

+0

Мои зависимости: 'org.apache.felix.framework' и' org.apache.felix.scr' и 'org.osgi.core' @Ralf –

+0

Пожалуйста, предоставьте POM первого сбоя. Вы использовали плагин bundle и package = bundle? – Puce

ответ

1

Bundle загрузки порядок не имеет значения в OSGi приложений.

Но службы OSGi могут иметь зависимости от других услуг.

Вы можете использовать инфраструктуру, такую ​​как декларативные службы, для легкого управления зависимостями (например, с помощью SCR annotations).

Вам понадобится следующий плагин:

 <plugin> 
      <groupId>org.apache.felix</groupId> 
      <artifactId>maven-scr-plugin</artifactId> 
      <executions> 
       <execution> 
        <id>generate-scr-scrdescriptor</id> 
        <goals> 
         <goal>scr</goal> 
        </goals> 
       </execution> 
      </executions> 
     </plugin> 

И следующие зависимости:

<dependency> 
     <groupId>org.apache.felix</groupId> 
     <artifactId>org.apache.felix.scr.annotations</artifactId> 
     <!-- only needed at compile time, not at runtime --> 
     <scope>provided</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.felix</groupId> 
     <artifactId>org.apache.felix.scr</artifactId> 
     <scope>runtime</scope> 
    </dependency> 
+0

Благодарим вас за ответ @Puce. Не могли бы вы указать мне на sscce. Я был в этом несколько дней. Я буду очень признателен за помощь. –

+0

@ Program-Me-Rev У меня нет SSCCE, но вот код, который я написал для Drombler FX, вы можете использовать в качестве образца, если хотите. Он имеет 3 зависимости (ссылки) к другим службам: https://github.com/Drombler/drombler-fx/blob/release-0.7/drombler-fx-core-standard-desktop-classic/src/main/java/org /drombler/fx/core/standard/desktop/classic/impl/ContentHandler.java – Puce

+0

Я получаю ошибки только для всех модулей, кроме модулей felix, когда я пытаюсь запустить проект после вызова mvn clean install, то есть всех модулей из центральное хранилище maven, такое как org.apache.felix.framework и org.apache.felix.scr, запускается в контейнере OSGi, за исключением тех, которые я пишу сам. Я сделал обновление по вопросу об этом. @Puce –