我编写了一个使用第三方库的应用程序。然后,我使用 maven-assembly-plugin 将其打包为可执行 jar(生成一个包含所有依赖项的 jar,包括一些第三方 jar)。
接下来,我需要将此 jar 添加到 PDE 项目中,以便可以从 eclipse 中启动它。但是为了完成这项工作,我需要将一些第三方依赖项添加到我的 PDE 项目中,该项目已经位于打包的 jar 中。所以我得到了重复的依赖项。关于如何避免这种情况的任何想法?或者对描述如何正确完成的文档提出建议?
您应该构建一个 jar,它是一个 OSGi 包:因此它包含所需的 manifest.mf 以及一个插件 id 和一个版本号(这不会改变 jar 仍然可执行的事实)。小心添加 export-packages 选项以使代码也可用于其他插件/捆绑包。
之后,您可以将此 jar 安装到 PDE 项目使用的目标平台中(在首选项中搜索 Target platform),这样它就可以通过 ID 用于其他插件(您可以将其添加为依赖项)。
这样,如果至少有一个插件需要您的 jar,它会被加载,但不会被多次加载。
我认为将其他 jar 包含在您的 jar 中只是简单的不好的做法。但是如果你想保持这种状态,那么从一个构建中创建两个 jar 怎么样:一个完整的具有依赖关系的,一个简单的在 PDE 中使用(只需在程序集插件中使用多个执行)
我现在正在使用 maven-bundle-plugin:
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<version>1.4.0</version>
<extensions>true</extensions>
<configuration>
<instructions>
<Bundle-SymbolicName>${pom.groupId}.${pom.artifactId}</Bundle-SymbolicName>
<Bundle-Name>${pom.name}</Bundle-Name>
<Bundle-Version>${pom.version}</Bundle-Version>
<Bundle-Activator>org.wso2.mbp.sample01.Activator</Bundle-Activator>
<Private-Package>org.wso2.mbp.sample01</Private-Package>
</instructions>
</configuration>
</plugin>
http://felix.apache.org/site/apache-felix-maven-bundle-plugin-bnd.html
构建一个捆绑包。但是我如何使用捆绑插件,以便使用 maven-assembly-plugin 为 jar 构建创建 MANIFEST 文件,我使用如下:
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<appendAssemblyId>true</appendAssemblyId>
<finalName>myApp</finalName>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>com.TestMain</mainClass>
<packageName>com.</packageName>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>assembly</goal>
</goals>
</execution>
</executions>
</plugin>