Феликс не стартовая связка - PullRequest
0 голосов
/ 07 января 2019

Невозможно загрузить пакет в Феликс. Я скачал Felix 6.0.1, запустил, используя

> java -jar bin/felix.jar
____________________________
Welcome to Apache Felix Gogo

g! 

Я создаю MavenProject TestA в затмении:

  1. Я добавляю зависимость к felix (6.0.1), как указано.
  2. Я создаю класс в TestA/src/main/java/testa/impl/Activator.java.
  3. Я расширяю класс testa.impl.Activator до org.osgi.framework.BundleActivator.
  4. Я перезаписываю public void start(BundleContext bc) throws Exception, чтобы распечатать Hello World!.

Это источник Java:

package testa.impl;

import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;

public class Activator implements BundleActivator {

    public void start(BundleContext arg0) throws Exception {
        System.out.println("Hello World!");
    }

    public void stop(BundleContext arg0) throws Exception {
        System.out.println("stop");
    }
}

Это мой pom.xml:

<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>test</groupId>
    <artifactId>testa</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <groupId>org.apache.felix</groupId>
            <artifactId>org.apache.felix.main</artifactId>
            <version>6.0.1</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>
    <build>
        <defaultGoal>clean install org.apache.felix:maven-bundle-plugin:bundle</defaultGoal>
    </build>
</project>

Затем я компилирую в jar с помощью mvn и загружаю с помощью

g! install file:/C:/xxx/TestA/target/testa-0.0.1-SNAPSHOT.jar                              
Bundle ID: 20

Затем я перечисляю все связки, используя lb

g! lb                                                                                                           15:51:56
START LEVEL 1
   ID|State      |Level|Name
    0|Active     |    0|System Bundle (6.0.1)|6.0.1
    1|Active     |    1|jansi (1.17.1)|1.17.1
    2|Active     |    1|JLine Bundle (3.7.0)|3.7.0
    3|Active     |    1|Apache Felix Bundle Repository (2.0.10)|2.0.10
    4|Active     |    1|Apache Felix Gogo Command (1.0.2)|1.0.2
    5|Active     |    1|Apache Felix Gogo JLine Shell (1.1.0)|1.1.0
    6|Active     |    1|Apache Felix Gogo Runtime (1.1.0)|1.1.0
   20|Installed  |    1|testa (0.0.1.SNAPSHOT)|0.0.1.SNAPSHOT
g!                                                                                                              

В любом случае, я запускаю пакет, используя start:

g! start 20
g!

Я ожидал, что напечатан «Hello World», но ничего не появляется!

Сейчас я в замешательстве и пытаюсь выяснить, действительно ли начался комплект.

g! lb                                                                                                           15:51:56
START LEVEL 1
   ID|State      |Level|Name
    0|Active     |    0|System Bundle (6.0.1)|6.0.1
    1|Active     |    1|jansi (1.17.1)|1.17.1
    2|Active     |    1|JLine Bundle (3.7.0)|3.7.0
    3|Active     |    1|Apache Felix Bundle Repository (2.0.10)|2.0.10
    4|Active     |    1|Apache Felix Gogo Command (1.0.2)|1.0.2
    5|Active     |    1|Apache Felix Gogo JLine Shell (1.1.0)|1.1.0
    6|Active     |    1|Apache Felix Gogo Runtime (1.1.0)|1.1.0
   20|Active     |    1|testa (0.0.1.SNAPSHOT)|0.0.1.SNAPSHOT
g!                                                                                                              15:51:58

Это началось, но мой код не был выполнен.

Вопрос

Почему Hello World не напечатано на консоли?

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Hello World не печатается на консоли, потому что созданный вами jar на самом деле не является пакетом. Как ни странно, felix позволяет вам запускать jar, который не имеет никакой информации, связанной с OSGI, в манифесте. Мне непонятно, что означает запуск такого пакета? Может быть, классы будут опубликованы, а может и нет.

Большинство java-фреймворков сканируют файлы в jar-файле и используют рефлексию или анализ байтового кода для поиска соответствующих классов. Для обычных фреймворков издержки на сканирование jar-ов возникают только один раз при запуске. OSGI был разработан, чтобы быть легким и также используется на мобильных устройствах. Более того, поскольку в OSGI пакеты могут приходить и уходить, они разработали более эффективный подход. Пакеты OSGI хранят метаданные в манифесте. Это простой текстовый файл, который всегда находится в одном и том же месте (в банке): "META-INF / MANIFEST.MF". Если вы используете zip-инструмент для проверки файла в банке, вы должны увидеть что-то вроде этого:

Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Created-By: Apache Maven
Built-By: Peter Rader
Build-Jdk: 1.8.0_111

Для дальнейшего устранения неполадок OSGI я бы предложил вам проверить (и опубликовать) созданный манифест.

Действительный манифест OSGI будет выглядеть примерно так:

Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Created-By: Apache Maven
Built-By: Peter Rader
Build-Jdk: 1.8.0_111
Bundle-Name: testa
Bundle-SymbolicName: testa.impl
Bundle-Version: 1.0.0
Bundle-Activator: testa.impl.Activator
Import-Package: org.osgi.framework

Когда Феликс читает этот манифест, он использует запись "Bundle-Activator", чтобы найти активатор (если есть). Замените манифест, и комплект должен быть развернут в обычном режиме.
Просто создайте текстовый файл с именем «META-INF / MANIFEST.MF», содержащий текст выше, в месте, относящемся к банке. Затем замените файл манифеста в jar следующей командой linux (или вашим любимым zip-инструментом):

zip testa-0.0.1-SNAPSHOT.jar -u META-INF/*

ожидаемый вывод команды zip:

updating: META-INF/MANIFEST.MF (deflated 36%)

Обязательно откройте банку с zip-файлом и убедитесь, что содержимое изменилось. Теперь, если вы установили и запустили пакет, он должен вывести «Hello World!».

Хотя это решает проблему, это не очень чистое решение.
В спецификации jar есть довольно странные правила относительно того, как должны быть отформатированы записи в манифесте:
https://docs.oracle.com/javase/7/docs/technotes/guides/jar/jar.html#Manifest_Specification
В частности:

No line may be longer than 72 bytes (not characters), in its UTF8-encoded form.
If a value would make the initial line longer than this, 
it should be continued on extra lines (each starting with a single SPACE).

Следовательно, вы не хотите редактировать этот файл вручную. Как уже отмечали другие, у вас есть различные варианты автоматического создания манифеста OSGI. Как и раньше, вы можете проверить манифест в сгенерированном банке, чтобы убедиться, что он генерируется правильно.

0 голосов
/ 07 января 2019

Вы, похоже, создаете манифест вручную. Вы должны использовать такие инструменты, как bnd-maven-plugin, чтобы сделать это. Поскольку вы вручную создали манифест, он выглядит неправильно. Вы не импортируете пакеты, которые используете в своем коде. А именно org.osgi.framework.

Кроме того, не расширяйте класс активатора из чужого кода, поскольку вы, как правило, не можете импортировать их пакеты реализации. Просто реализуй это сам:

import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;

public class TestA implements BundleActivator {
...