有没有办法在不编辑目标平台的情况下添加带有包的外部jar,只为当前项目定义这些jar。我遇到了一些错误,因为全局定义了错误的插件。
作为参考,我使用了这个答案:External jars not resolved as bundles in MANIFEST.MF
答案 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的主项目。 以下是如何从头开始创建此类项目:
首先,在Eclipse Kepler(或更高版本)中,通过File-> New-> Maven Project创建一个新的maven项目。 在显示的新窗口中,选择要将项目保存到的文件夹,它可以是您的工作区或任何其他文件夹。
选择“创建简单项目(跳过动作类型选择)”选项,然后按“下一步”。 填写组ID名称和工件ID名称。这些是用于在maven存储库中标识项目的参数,其中每个项目由对表示(不要问我为什么选择这种方式来命名项目)。你可以任意命名。我只是将“.master”附加到我的工件ID,以突出显示该项目只是父POM。父POM是一个POM.XML文件,其中包含我们想要开发的所有捆绑包所共有的所有信息。
按完成。 现在,如果你看看你的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 /目录中:
不要担心,如果在您的项目中,除了我在这里之外,您还会看到maven依赖项或其他文件夹。有时eclipse将它们放在那里,有时它不会,它就像魔术一样。 如果遇到任何奇怪的问题,只需选择项目并转到Maven - &gt;更新Maven项目,选择强制更新快照/版本,确保在上面的列表中选择了您的项目并点击确定。
现在是时候创建我们的捆绑包了。为了简单起见,我们只创建一个简单的包,所以最简单的方法是在我们的项目中创建一个新文件夹,并为其指定包的名称,例如:
现在使用以下内容在该文件夹中创建一个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自动检测到新项目。
点击完成并查找新导入的项目。 您会看到您的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框架包/文件夹。
注意:每次运行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消息!
希望这有帮助!
在此链接中,您可以找到我为此示例制作的项目以及部署了此项目的felix框架,随时可以在本迷你教程的最后看到。
https://www.dropbox.com/s/pazhtrjmu50zsv9/example-source.zip