gpt4 book ai didi

java - 仅在Eclipse中将带有捆绑的外部jar添加到项目中

转载 作者:太空宇宙 更新时间:2023-11-04 14:51:21 26 4
gpt4 key购买 nike

有没有一种方法可以添加带有捆绑包的外部jar,而无需编辑目标平台,而只需为当前项目定义这些jar。我在全局定义了错误的插件时遇到了一些错误。

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

最佳答案

我曾经尝试使用目标平台来做到这一点。但是,Eclipse PDE非常凌乱和奇怪。

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

我这样做的方法是通过创建一个内部项目捆绑在一起的主项目。
从头开始创建此类项目的方法如下:



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



选择选项“创建简单项目(跳过achetype选择)”,然后按Next。
填写组标识名称和工件标识名称。这些参数用于在Maven存储库中标识您的项目,其中每个项目均以该对表示(不要问我为什么他们选择这种方式来命名项目)。您可以根据需要命名。我只是在工件ID后面附加了“ .master”,以突出表明该项目只是父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捆绑包插件创建捆绑包。更具体地说,您的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实现,因为Equinox就像Eclipse PDE一样麻烦,除非在日食环境之外使用,但这是另外一回事了……)。
默认情况下,maven将在maven的中央存储库中搜索这些依赖关系,该中央存储库是一个庞大的在线存储库,其中包含大量Java库供我们使用。
如果现在在“项目资源管理器”窗口中选择该项目,然后右键单击它,然后转到“运行方式”->“ Maven安装”,则会看到控制台输出以下内容:

                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部分非常重要,这意味着到目前为止一切正常!
现在,如果尝试运行方式-> Maven Build…,然后在显示的窗口中的“目标”字段中键入-Pcreate-osgi-bundles-from-dependencies bundle:wrap,然后单击运行,则将进行maven下载这3个依赖项(junit和org.orgi。*),并从它们中创建捆绑包(此操作称为打包为捆绑包)。它将这些捆绑包放入项目的bundles /目录中:



别担心,在您的项目中,除了我在这里看到的以外,您还会看到maven依赖项或其他文件夹。有时蚀把它们放在那儿,有时却没有,就像魔术一样。
如果遇到任何奇怪的问题,只需选择项目,然后转到Maven-> Update Maven Project,选择Force Update of Snapshots / Releases,确保在上面的列表中选择了您的项目,然后单击Ok。



现在该创建捆绑包了。为了简单起见,我们将只创建一个简单的包,因此最简单的方法是在项目内部创建一个新文件夹,并为其命名,例如:



现在,在该文件夹中创建具有以下内容的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-> Import-> Existing Maven Projects,然后选择主项目的文件夹,您会看到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 install!
每次进行Maven安装时,它将在您的target /文件夹中生成一个.jar。该.jar是您项目的捆绑包,您可以将其部署到OSGi框架。但是现在您也希望将所有相关的依赖项生成为捆绑包,以便它们也可以进入OSGi Framework运行时。对于我们的示例,我已经在该捆绑包POM文件中放置了一个依赖关系,该依赖关系与我们的实际代码无关,它不是必需的,但是我将其放在此处以显示如果您对此捆绑包具有依赖关系,maven的行为(其他java.lang中已经包含的java.lang)。
选择主项目,然后转到运行方式-> Maven构建…,然后在显示的窗口的“目标”字段中键入-Pcreate-osgi-bundles-from-dependencies bundle:wrap,然后单击运行,您将maven从父/主项目及其捆绑软件(在我们的情况下,我们只有一个捆绑软件)下载所有依赖项,并从它们创建捆绑软件。
现在,您应该将每个程序包放在每个项目(主程序和helloworldbundle)中的bundles /文件夹中。现在,下载felix OSGi框架,并将所有这些jar以及捆绑包的target /目录中的jar文件复制到felix框架bundle /文件夹中。



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

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


在Eclipse中运行方式-> Maven安装,将target /文件夹中新生成的.jar再次复制到felix框架中。从此处删除org.zeromq.scala-binding_2.10_0.0.7.jar文件,然后再次运行felix框架。
您现在应该看到世界问候消息!



希望这可以帮助!

在此链接中,您可以找到我为该示例创建的项目以及已部署此项目的felix框架,可以按照本迷你教程结尾处的说明运行。

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

关于java - 仅在Eclipse中将带有捆绑的外部jar添加到项目中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23737215/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com