添加带有bundle的外部jar只能在Eclipse中进行项目

时间:2014-05-19 12:01:09

标签: java eclipse osgi

有没有办法在不编辑目标平台的情况下添加带有包的外部jar,只为当前项目定义这些jar。我遇到了一些错误,因为全局定义了错误的插件。

作为参考,我使用了这个答案:External jars not resolved as bundles in MANIFEST.MF

1 个答案:

答案 0 :(得分:0)

我曾尝试使用目标平台来做到这一点。但是日食PDE非常混乱和奇怪。

今天我使用Maven Bundle Plugin来管理我的OSGi项目。除非你真的需要使用eclipse插件/平台而你别无选择,否则我建议你尝试使用felix maven bundle plugin(http://felix.apache.org/site/apache-felix-maven-bundle-plugin-bnd.html)。

我这样做的方法是在里面创建一个包含bundle的主项目。 以下是如何从头开始创建此类项目:

enter image description here

首先,在Eclipse Kepler(或更高版本)中,通过File-> New-> Maven Project创建一个新的maven项目。 在显示的新窗口中,选择要将项目保存到的文件夹,它可以是您的工作区或任何其他文件夹。

enter image description here

选择“创建简单项目(跳过动作类型选择)”选项,然后按“下一步”。 填写组ID名称和工件ID名称。这些是用于在maven存储库中标识项目的参数,其中每个项目由对表示(不要问我为什么选择这种方式来命名项目)。你可以任意命名。我只是将“.master”附加到我的工件ID,以突出显示该项目只是父POM。父POM是一个POM.XML文件,其中包含我们想要开发的所有捆绑包所共有的所有信息。

enter image description here

按完成。 现在,如果你看看你的POM.XML,你会看到很少的行带有一些无用的信息以及我们的组和工件ID。

<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插件创建bundle。更具体地说,您的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>

如果你看一下依赖项部分,你会发现我们所有的bundle都需要junit,org.osgi.core和org.osgi.compendium(我选择了felix实现,因为equinox和ass一样痛苦。 Eclipse PDE,除非在eclipse环境之外使用,但这是一个不同的故事......)。 默认情况下,maven将在maven的中央存储库中搜索这些依赖项,这是一个庞大的在线存储库,拥有大量的Java库供我们使用。 如果您现在在项目浏览器窗口中选择项目并右键单击它并转到Run As-&gt; 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部分,这非常重要,这意味着到目前为止一切正常! 现在,如果你试试Run As - &gt; Maven Build ...并输入-Pcreate-osgi-bundles-from-dependencies bundle:在显示的窗口中的“Goals”字段中打包,然后点击Run,你将使maven下载这3个依赖项(junit和org.orgi) 。*)并从中创建包(此操作称为包装为包)。它会将这些包放在项目的bundle /目录中:

enter image description here

不要担心,如果在您的项目中,除了我在这里之外,您还会看到maven依赖项或其他文件夹。有时eclipse将它们放在那里,有时它不会,它就像魔术一样。 如果遇到任何奇怪的问题,只需选择项目并转到Maven - &gt;更新Maven项目,选择强制更新快照/版本,确保在上面的列表中选择了您的项目并点击确定。

enter image description here

现在是时候创建我们的捆绑包了。为了简单起见,我们只创建一个简单的包,所以最简单的方法是在我们的项目中创建一个新文件夹,并为其指定包的名称,例如:

enter image description here

现在使用以下内容在该文件夹中创建一个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.master的POM.XML中查找标签并将其替换为:

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

现在在Eclipse中你可以进行File-&gt; Import-&gt;现有Maven项目并选择主项目的文件夹,你会看到eclipse自动检测到新项目。

enter image description here

点击完成并查找新导入的项目。 您会看到您的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安装时,它都会在目标/文件夹中生成一个.jar。 .jar是您可以部署到OSGi Framework的项目包。但是现在您希望将所有相关的依赖项生成为bundle,以便它们也可以进入OSGi Framework运行时。对于我们的示例,我在这个包POM文件中添加了一个依赖项,它与我们的实际代码无关,它不需要,但我把它放在那里向你展示如果你有这个包的依赖项,maven将如何表现(其他java.lang,已经包含在任何Java运行时环境中)。 选择主项目并转到Run As - &gt; Maven Build ...并输入-Pcreate-osgi-bundles-from-dependencies bundle:在显示的窗口中显示“Goals”字段,然后点击Run,你将maven从父/ master项目中下载所有依赖项和它的捆绑(在我们的情况下,我们只有一个捆绑)并从它们创建捆绑。 您现在应该在每个项目(master和helloworldbundle)内的bundle /文件夹中包含您的bundle。现在下载felix OSGi Framework并将所有这些jar文件以及bundle目标/目录中的jar文件复制到felix框架包/文件夹。

enter image description here

注意:每次运行felix时,您都可以删除缓存文件夹以完全重置框架,以防您更新某些软件包并更新损坏运行时。 现在打开cmd,转到你的felix根路径并输入:java -jar bin \ felix.jar 您应该看到一条巨大的错误消息。这是因为我们在bundle的pom文件中添加了示例依赖项。所以我们删除它,因为它只是一个例子。 所以你需要删除它:

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

运行方式 - &gt; Maven在eclipse中安装,再次将目标/文件夹中新生成的.jar复制到felix框架中。从那里删除org.zeromq.scala-binding_2.10_0.0.7.jar文件并再次运行felix框架。 您现在应该看到hello world消息!

enter image description here

希望这有帮助!

在此链接中,您可以找到我为此示例制作的项目以及部署了此项目的felix框架,随时可以在本迷你教程的最后看到。

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