добавление внешних jar с пакетами в проект только в Eclipse

1

Есть ли способ добавить внешние банки с пакетами без редактирования целевой платформы и просто определить эти банки для текущего проекта. Я сталкиваюсь с некоторыми ошибками с неправильными плагинами, определенными глобально.

В качестве ссылки я использовал этот ответ: внешние банки не разрешены как пакеты в MANIFEST.MF

Теги:
osgi

1 ответ

0

Однажды я попытался использовать целевую платформу для этого. Но Eclipse PDE очень грязный и странный.

Сегодня я использую Maven Bundle Plugin для управления моими проектами OSGi. Если вам действительно не нужно работать с плагинами/платформой eclipse, и у вас нет другого выбора, я бы предложил вам попробовать maven с плагином felix maven bundle (http://felix.apache.org/site/apache-felix-maven- bundle-plugin-bnd.html).

То, как я это делаю, - это создать один мастер-проект с пучками внутри. Вот как создать такой проект с нуля:

Изображение 174551

Во-первых, в Eclipse Kepler (или позже) создайте новый проект maven, перейдя в File-> New-> Maven Project. В появившемся новом окне выберите папку для сохранения проекта, это может быть ваше рабочее пространство или любая другая папка.

Изображение 174551

Выберите вариант "Создать простой проект (пропустить выбранный тип)" и нажмите "Далее". Заполните имя идентификатора группы и имя идентификатора артефакта. Это параметры, используемые для идентификации вашего проекта в репозиториях maven, где каждый проект представлен парой (не спрашивайте меня, почему они выбрали этот способ для названия проектов). Вы можете назвать их чем угодно. Я просто добавил ".master" к своему идентификатору артефакта, чтобы подчеркнуть, что этот проект является только родительским POM. Родительский POM представляет собой файл POM.XML, содержащий всю информацию, которая является общей для всех наших пакетов, которые мы хотим разработать.

Изображение 174551

Нажмите "Готово". Теперь, если вы посмотрите на свой 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>such.osgi.example</groupId>
 <artifactId>very.example.master</artifactId>
 <version>0.0.1-SNAPSHOT</version>
 </project>

Нам нужно сделать maven понятным, что мы собираемся создавать пакеты, используя felix apache maven bundle plugin. Более конкретно, ваш 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>such.osgi.example</groupId>
          <artifactId>very.example.master</artifactId>
          <version>0.0.1-SNAPSHOT</version>
          <name>${project.artifactId}</name>

            <properties>
                <project.build.sourceEncoding>ISO-8859-1</project.build.sourceEncoding>
            </properties>

            <packaging>pom</packaging>

            <modules>
            </modules>

            <profiles>
                <!-- http://www.lucamasini.net/Home/osgi-with-felix/creating-osgi-bundles-of-your-maven-dependencies -->
                <!-- -Pcreate-osgi-bundles-from-dependencies bundle:wrap -->
                <profile>
                    <id>create-osgi-bundles-from-dependencies</id>
                    <build>
                        <directory>${basedir}/bundles</directory>
                        <plugins>
                            <plugin>
                                <groupId>org.apache.felix</groupId>
                                <artifactId>maven-bundle-plugin</artifactId>
                                <version>2.0.1</version>
                                <extensions>true</extensions>
                                <executions>
                                    <execution>
                                        <id>wrap-my-dependency</id>
                                        <goals>
                                            <goal>wrap</goal>
                                        </goals>
                                        <configuration>
                                            <wrapImportPackage>;</wrapImportPackage>
                                        </configuration>
                                    </execution>
                                </executions>
                            </plugin>
                        </plugins>
                    </build>
                </profile>
            </profiles>

            <build>
                <sourceDirectory>src</sourceDirectory>
                <testSourceDirectory>test</testSourceDirectory>

                <plugins>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-compiler-plugin</artifactId>
                        <version>3.1</version>
                        <configuration>
                            <source>1.6</source>
                            <target>1.6</target>
                        </configuration>
                    </plugin>
                    <plugin>
                        <groupId>org.apache.felix</groupId>
                        <artifactId>maven-bundle-plugin</artifactId>
                        <version>2.3.7</version>
                        <extensions>true</extensions>
                    </plugin>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-javadoc-plugin</artifactId>
                        <version>2.5</version>
                    </plugin>
                </plugins>
            </build>

            <dependencies>
                <dependency>
                    <groupId>junit</groupId>
                    <artifactId>junit</artifactId>
                    <version>4.8.1</version>
                </dependency>
                <dependency>
                    <groupId>org.apache.felix</groupId>
                    <artifactId>org.osgi.core</artifactId>
                    <version>1.4.0</version>
                </dependency>
                <dependency>
                    <groupId>org.apache.felix</groupId>
                    <artifactId>org.osgi.compendium</artifactId>
                    <version>1.4.0</version>
                </dependency>
            </dependencies>
        </project>

Если вы посмотрите на часть зависимостей, вы увидите, что всем нашим пакетам понадобится junit, org.osgi.core и org.osgi.compendium (я выбираю реализацию felix, потому что равноденствие равносильно боли в заднице, как Eclipse PDE, если только не используется вне среды затмения, но это другая история...). По умолчанию maven будет искать эти зависимости в центральном репозитории mavens - огромном репозитории в Интернете, в котором есть множество библиотек java. Если теперь вы выбираете проект в окне проводника проекта и щелкаете правой кнопкой мыши по нему и переходите к Run As-> Maven Install, вы увидите, что консоль выводит это:

                SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
                SLF4J: Defaulting to no-operation (NOP) logger implementation
                SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
                [INFO] Scanning for projects...
                [INFO]                                                                         
                [INFO] ------------------------------------------------------------------------
                [INFO] Building very.example.master 0.0.1-SNAPSHOT
                [INFO] ------------------------------------------------------------------------
                [INFO] 
                [INFO] --- maven-resources-plugin:2.5:resources (default-resources) @ very.example.master ---
                [debug] execute contextualize
                [WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources, i.e. build is p
                latform dependent!
                [INFO] Copying 0 resource
                [INFO] 
                [INFO] --- maven-compiler-plugin:2.3.2:compile (default-compile) @ very.example.master ---
                [INFO] Nothing to compile - all classes are up to date
                [INFO] 
                [INFO] --- maven-resources-plugin:2.5:testResources (default-testResources) @ very.example.mast
                er ---
                [debug] execute contextualize
                [WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources, i.e. build is p
                latform dependent!
                [INFO] Copying 0 resource
                [INFO] 
                [INFO] --- maven-compiler-plugin:2.3.2:testCompile (default-testCompile) @ very.example.master 
                ---
                [INFO] Nothing to compile - all classes are up to date
                [INFO] 
                [INFO] --- maven-surefire-plugin:2.10:test (default-test) @ very.example.master ---
                [INFO] Surefire report directory: C:\Users\Pedro\workspace\very.example.master\target\surefire-
                reports
                Downloading: http://repo.maven.apache.org/maven2/org/apache/maven/surefire/surefire-junit3/2.10
                /surefire-junit3-2.10.pom
                Downloaded: http://repo.maven.apache.org/maven2/org/apache/maven/surefire/surefire-junit3/2.10/
                surefire-junit3-2.10.pom (2 KB at 4.5 KB/sec)
                Downloading: http://repo.maven.apache.org/maven2/org/apache/maven/surefire/surefire-junit3/2.10
                /surefire-junit3-2.10.jar
                Downloaded: http://repo.maven.apache.org/maven2/org/apache/maven/surefire/surefire-junit3/2.10/
                surefire-junit3-2.10.jar (26 KB at 143.4 KB/sec)

                -------------------------------------------------------
                 T E S T S
                -------------------------------------------------------

                Results :

                Tests run: 0, Failures: 0, Errors: 0, Skipped: 0

                [INFO] 
                [INFO] --- maven-jar-plugin:2.3.2:jar (default-jar) @ very.example.master ---
                [INFO] Building jar: C:\Users\Pedro\workspace\very.example.master\target\very.example.master-0.
                0.1-SNAPSHOT.jar
                [INFO] 
                [INFO] --- maven-install-plugin:2.3.1:install (default-install) @ very.example.master ---
                [INFO] Installing C:\Users\Pedro\workspace\very.example.master\target\very.example.master-0.0.1
                -SNAPSHOT.jar to C:\Users\Pedro\.m2\repository\such\osgi\example\very.example.master\0.0.1-SNAP
                SHOT\very.example.master-0.0.1-SNAPSHOT.jar
                [INFO] Installing C:\Users\Pedro\workspace\very.example.master\pom.xml to C:\Users\Pedro\.m2\re
                pository\such\osgi\example\very.example.master\0.0.1-SNAPSHOT\very.example.master-0.0.1-SNAPSHO
                T.pom
                [INFO] ------------------------------------------------------------------------
                [INFO] BUILD SUCCESS
                [INFO] ------------------------------------------------------------------------
                [INFO] Total time: 2.711s
                [INFO] Finished at: Mon May 19 14:47:00 BST 2014
                [INFO] Final Memory: 5M/15M
                [INFO] ------------------------------------------------------------------------

Обратите внимание на часть BUILD SUCCESS, это очень важно, это означает, что все в порядке! Теперь, если вы попробуете запустить As → Maven Build... и введите пакет -Pcreate-osgi-bundles-from-dependencies: оберните в поле "Цели" в появившемся окне и нажмите "Запустить", вы сделаете maven загружать те 3 зависимостей (junit и org.orgi. *) и создания пакетов из них (это действие называется обертыванием в виде пакета). Он поместит эти пакеты в каталог bundles/вашего проекта:

Изображение 174551

Не беспокойтесь, если в вашем проекте вы также видите зависимости maven или другие папки, кроме тех, которые у меня есть здесь. Иногда eclipse ставит их там, иногда это не так, как магия. Если вы столкнулись с какой-то странной проблемой, просто выберите проект и перейдите в Maven → Update Maven Project, выберите Force Update of Snapshots/Releases, убедитесь, что ваш проект выбран в списке выше и нажмите Ok.

Изображение 174551

Теперь пришло время создавать наши пакеты. Ради простоты создайте только один простой комплект, поэтому самый простой способ сделать это - создать новую папку внутри нашего проекта и присвоить ей имя нашего пакета, например:

Изображение 174551

Теперь создайте файл 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>

        <parent>
            <relativePath>../pom.xml</relativePath>
            <groupId>such.osgi.example</groupId>
            <artifactId>very.example.master</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </parent>

        <artifactId>very.example.mybundles.helloworldbundle</artifactId>
        <packaging>bundle</packaging>

        <build>
            <sourceDirectory>src</sourceDirectory>
            <plugins>
                <plugin>
                    <groupId>org.apache.felix</groupId>
                    <artifactId>maven-bundle-plugin</artifactId>
                    <extensions>true</extensions>
                    <configuration>
                        <instructions>
                            <Bundle-SymbolicName>${project.artifactId};singleton:=true</Bundle-SymbolicName>
                            <Bundle-Version>${project.version}</Bundle-Version>
                            <Export-Package>very.example.mybundles.helloworldbundle</Export-Package>
                            <Bundle-Activator>very.example.mybundles.helloworldbundle.Activator</Bundle-Activator>
                        </instructions>
                    </configuration>
                </plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                </plugin>
            </plugins>
        </build>

        <name>${project.artifactid}</name>

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

        <dependencies>
            <dependency>
                <groupId>org.zeromq</groupId>
                <artifactId>zeromq-scala-binding_2.10</artifactId>
                <version>0.0.7</version>
            </dependency>
        </dependencies>
    </project>

В файле very.example.masters POM.XML найдите теги и замените их следующим:

    <modules>
        <module>very.example.mybundles.helloworldbundle</module>
    </modules>

Теперь в Eclipse вы делаете File-> Import-> Existing Maven Projects и выбираете папку вашего основного проекта, вы увидите, что eclipse автоматически обнаруживает новый проект.

Изображение 174551

Нажмите "Готово" и найдите новый импортированный проект. Вы увидите, что ваш файл POM содержит ошибки, но они являются ложными срабатываниями, просто игнорируйте их пока. Что maven пытается сказать вам, так это то, что в вашем проекте нет файлов-источников (а именно активатора пакетов). Поэтому создайте новую папку внутри этого нового проекта под названием "src" и поместите свой Activator.java внутри. Его код выглядит следующим образом:

    package very.example.mybundles.helloworldbundle;

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

    public class Activator implements BundleActivator {

        @Override
        public void start(BundleContext arg0) throws Exception {
            System.out.println("hello world!");
        }

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

    }

На данный момент у вашего проекта не должно быть ошибок, и он должен корректно запускать maven! Каждый раз, когда вы устанавливаете maven install, он генерирует.jar в вашей целевой папке. Это.jar - это пакет ваших проектов, который можно развернуть в OSGi Framework. Но теперь вы хотите сгенерировать все связанные зависимости в виде пакетов, чтобы они также могли перейти в среду выполнения OSGi Framework. В нашем примере Ive помещает зависимость в этот пакетный файл POM, который не имеет никакого отношения к нашему фактическому коду, он не нужен, но я поставил его там, чтобы показать вам, как будет вести себя maven, если бы у вас были зависимости для этого пакета (другие, которые java.lang, которые уже включены в среду java runtime). Выберите главный проект и перейдите в Run As → Maven Build... и введите пакет -Pcreate-osgi-bundles-from-dependencies: оберните в поле "Цели" в появившемся окне и нажмите "Запустить", вы сделаете maven download те из всех зависимостей от родительского/мастер-проекта и его пакетов (в нашей ситуации мы просто имеем один комплект) и создаем из них пакеты. Теперь у вас должны быть ваши пакеты в папках/папках внутри каждого проекта (мастер и helloworldbundle). Теперь загрузите felix OSGi Framework и скопируйте все эти банки, а также файл jar в каталог/каталог пакетов в каталог/папку felix.

Изображение 174551

Примечание. Каждый раз, когда вы запускаете felix, вы можете удалить папку кэша, чтобы полностью сбросить фреймворк, в случае, если вы обновите некоторые пакеты и обновления, это повредило среду выполнения. Теперь откройте cmd, перейдите к корневому пути felix и введите: java -jar bin\felix.jar. Вы увидите огромное сообщение об ошибке. Это связано с тем, что эта примерная зависимость была добавлена в файл pom bundles. Поэтому давайте удалим его, поскольку это был всего лишь пример. Поэтому вам нужно удалить это:

    <dependencies>
            <dependency>
                <groupId>org.zeromq</groupId>
                <artifactId>zeromq-scala-binding_2.10</artifactId>
                <version>0.0.7</version>
            </dependency>
        </dependencies>

Запустите As → Maven Install в eclipse, снова скопируйте новый сгенерированный файл.jar в целевую/папку в фельсинг-структуру. Удалите файл org.zeromq.scala-binding_2.10_0.0.7.jar и снова запустите felix framework. Теперь вы должны увидеть приветственное мировое сообщение!

Изображение 174551

Надеюсь это поможет!

В этой ссылке вы можете найти проект, который я сделал для этого примера, и felix framework с этим проектом, развернутым, готовым к запуску, как вы видите в конце этого мини-учебника.

https://www.dropbox.com/s/pazhtrjmu50zsv9/example-source.zip

Ещё вопросы

Сообщество Overcoder
Наверх
Меню