2015-08-30 2 views
-2

Я хочу использовать один из примеров to launch a FrameworkFactory. Либо мой компилятор отказывается компилировать ...Что нужно знать о maven Мне нужно загрузить OSGi FrameworkFactory

Map<String,String> props=new HashMap<String,String>(); 
props.put("org.osgi.framework.storage","target/osgi-store"); 
props.put("org.osgi.framework.storage.clean","onFirstInit"); 
FrameworkFactory factory=ServiceLoader.load(FrameworkFactory.class); 
// Type mismatch: cannot convert from ServiceLoader<FrameworkFactory> to FrameworkFactory 

или виртуальная машина не может загрузить завод ...

ServiceLoader<FrameworkFactory> loader = ServiceLoader.load(FrameworkFactory.class); 
Iterator<FrameworkFactory> iter = loader.iterator(); 
FrameworkFactory ff = iter.next(); // there is no "next" 

Это мой ПОМ

<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> 
<groupId>prices.otemba.org</groupId> 
<artifactId>PricesFromOtemba</artifactId> 

<version>0.0.1</version> 
<packaging>jar</packaging> 

<properties> 
    <maven.compiler.source>1.8</maven.compiler.source> 
    <maven.compiler.target>1.8</maven.compiler.target> 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
</properties> 


<build> 
    <plugins> 
     <plugin> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <version>3.3</version> 
      <configuration> 
       <source>1.8</source> 
       <target>1.8</target> 
       <configuration> 
        <fork>true</fork> 
        <executable>C:\Program Files\Java\jdk1.8.0_60\bin\javac.exe</executable> 
       </configuration> 
      </configuration> 
     </plugin> 
    </plugins> 
</build> 

<dependencies> 

    <dependency> 
     <groupId>javax.servlet</groupId> 
     <artifactId>javax.servlet-api</artifactId> 
     <version>3.1.0</version> 
    </dependency> 

    <dependency> 
     <groupId>org.codehaus.jackson</groupId> 
     <artifactId>jackson-core-asl</artifactId> 
     <version>1.9.13</version> 
    </dependency> 

    <dependency> 
     <groupId>org.codehaus.jackson</groupId> 
     <artifactId>jackson-mapper-asl</artifactId> 
     <version>1.9.13</version> 
    </dependency> 

    <dependency> 
     <groupId>com.fasterxml.jackson.core</groupId> 
     <artifactId>jackson-databind</artifactId> 
     <version>2.5.4</version> 
    </dependency> 

    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-web</artifactId> 
     <version>1.2.3.RELEASE</version> 
    </dependency> 

    <dependency> 
     <groupId>org.springframework.security</groupId> 
     <artifactId>spring-security-core</artifactId> 
     <version>4.0.1.RELEASE</version> 
    </dependency> 

    <dependency> 
     <groupId>org.springframework.security</groupId> 
     <artifactId>spring-security-web</artifactId> 
     <version>4.0.1.RELEASE</version> 
    </dependency> 

    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-webmvc</artifactId> 
     <version>4.1.6.RELEASE</version> 
    </dependency> 

    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-web</artifactId> 
     <version>4.1.6.RELEASE</version> 
    </dependency> 

    <dependency> 
     <groupId>org.springframework.security</groupId> 
     <artifactId>spring-security-config</artifactId> 
     <version>4.0.1.RELEASE</version> 
    </dependency> 

    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>4.11</version> 
     <scope>test</scope> 
    </dependency> 

    <dependency> 
     <groupId>info.cukes</groupId> 
     <artifactId>cucumber-java</artifactId> 
     <version>1.2.2</version> 
     <scope>test</scope> 
    </dependency> 

    <dependency> 
     <groupId>info.cukes</groupId> 
     <artifactId>cucumber-junit</artifactId> 
     <version>1.2.2</version> 
     <scope>test</scope> 
    </dependency> 

    <dependency> 
     <groupId>org.apache.felix</groupId> 
     <artifactId>org.apache.felix.gogo.runtime</artifactId> 
     <version>0.16.2</version> 
    </dependency> 

    <dependency> 
     <groupId>org.osgi</groupId> 
     <artifactId>org.osgi.core</artifactId> 
     <version>4.3.0</version> 
    </dependency> 

    <dependency> 
     <groupId>org.apache.felix</groupId> 
     <artifactId>org.osgi.core</artifactId> 
     <version>1.4.0</version> 
    </dependency> 

</dependencies> 

Если вы есть предложение относительно моего поместья, тогда, пожалуйста, не стесняйтесь советов.

+0

Решена проблема с ... \t \t \t \t \t org.eclipse.core \t \t \t выполнения \t \t \t 3.10.0-v20140318-2214 \t \t otembajelle

+1

Если вы решили, либо ответьте на свой вопрос, чтобы этот вопрос был закрыт. Или удалите его. – phiver

+0

Возможный дубликат [OSGi, полученный FrameworkFactory, не может быть инстансирован Ошибка] (https://stackoverflow.com/questions/42760795/osgi-got-frameworkfactory-could-not-be-instantiated-error) – Vogel612

ответ

0

Так что мой вопрос о java.util.ServiceLoader

В documentation говорится: «Он ищет поставщиков услуг на пути к классам вашего приложения». Я построил примеры и очень сомневаюсь в этом утверждении. Примеры должны быть собраны в .jar с подкаталогом в META-INF, имеющим полное квалифицированное имя службы.

В этом случае это будет полное квалифицированное имя класса, которое реализует org.osgi.framework.launch.FrameworkFactory.

Итак, я проверил свой репозиторий M2, если у этого пакета есть org.osgi.core. Ответ - нет.

Заключение: Примеры, которые я использовал, не подходят для пучков, которые не были подготовлены к java.util.ServiceLoader

1

Так следующая запись:

<dependency> 
    <groupId>org.osgi</groupId> 
    <artifactId>org.osgi.core</artifactId> 
    <version>4.3.0</version> 
</dependency> 

Добавляет OSGi 4.3 API для вашего проекта (обратите внимание, что для генериков не требуется 4.3.1 или выше). Это предоставляет вам интерфейс FrameworkFactory, но не существует реализации для загрузчика услуг. Чтобы получить реализацию, во время выполнения вам нужно иметь фреймворк OSGi R4.3 (или выше) на пути к вашему классу.

Например, чтобы добавить рамки Apache Felix осуществления R6 (который является обратно совместимым с API R4.3) вы бы добавить:

<dependency> 
    <groupId>org.apache.felix</groupId> 
    <artifactId>org.apache.felix.framework</artifactId> 
    <version>5.0.1</version> 
    <!-- You aren't compiling against Felix, just using it at runtime --> 
    <scope>runtime</scope> 
</dependency> 

Я хотел бы также предложить удаление следующее:

<dependency> 
    <groupId>org.apache.felix</groupId> 
    <artifactId>org.osgi.core</artifactId> 
    <version>1.4.0</version> 
</dependency> 

Причина, по которой вы должны удалить это, заключается в том, что это гораздо более старая версия баннера OSGi API. Он не содержит интерфейс FrameworkFactory (он предшествует ему), и он столкнется с OSGi 4.3 API, который также находится на пути компиляции.

Смежные вопросы