我正在开发一个需要com.lmax.disruptor的eclipse插件。它导入了sun.misc。我在我的p2存储库中有这个,但是当我maven构建我的插件时,我收到此错误“无法满足从com.lmax.disruptor 3.2.0到sun.misc 0.0.0的包依赖。”
我已经浏览了他们所说的创建插件片段的网站Resolve a dependency on package sun.misc with Tycho但是当我尝试创建它并将导出页面添加为sun.misc时,它会抛出一个错误,例如“package sun.misc does not在插件中存在“。
如何解决这个问题请帮我解决这个问题。而不是创建新的插件片段,我可以在插件中添加任何可能的方式吗?
谢谢,
答案 0 :(得分:1)
正如您链接到的问题oberlies' answer中所述,您需要构建一个系统捆绑片段,它会公开(即导出)sun.misc
包。我不知道其他任何方式。但是,这比预期的要容易。
您可以通过创建导出sun.misc的OSGi MANIFEST.MF
来执行此操作,然后将其捆绑到片段中。这是通过Maven完成的,如下所示。
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>your.group</groupId>
<version>1.0.0</version>
<artifactId>your.group.fragment.sun.misc</artifactId>
<packaging>jar</packaging>
<name>System Bundle Fragment exporting sun.misc</name>
<description>This bundle extends the System Bundle export list with the sun.misc package such that OSGi bundles may refer to Sun's misc implementation without the OSGi framework itself to provide it in a non-portable way.</description>
<build>
<plugins>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<forceCreation>true</forceCreation>
<archive>
<manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
<manifestEntries>
<Export-Package>sun.misc</Export-Package>
</manifestEntries>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<version>2.5.4</version>
<executions>
<execution>
<id>bundle-manifest</id>
<phase>process-classes</phase>
<goals>
<goal>manifest</goal>
</goals>
</execution>
</executions>
<configuration>
<instructions>
<Bundle-Category>your.group</Bundle-Category>
<Fragment-Host>system.bundle; extension:=framework</Fragment-Host>
</instructions>
</configuration>
</plugin>
</plugins>
</build>
</project>
在此POM上运行mvn clean install
。现在您需要为Tycho制作片段,即需要通过p2软件站点提供。
值得庆幸的是,有一个很棒的Maven插件可以提供帮助:reficio's p2-maven-plugin。您可以使用它将任何mavenized JAR基本上包装到OSGi包中,然后通过p2站点提供它。
按如下方式设置相应的POM。
<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>sun-misc-p2</groupId>
<artifactId>site</artifactId>
<version>1.0.0</version>
<packaging>pom</packaging>
<build>
<plugins>
<plugin>
<groupId>org.reficio</groupId>
<artifactId>p2-maven-plugin</artifactId>
<version>1.1.1</version>
<executions>
<execution>
<id>default-cli</id>
<configuration>
<artifacts>
<!-- specify your depencies here -->
<!-- groupId:artifactId:version -->
<artifact><id>com.lmax:disruptor:3.3.2</id></artifact>
<artifact><id>your.group:your.group.fragment.sun.misc:1.0.0</id></artifact>
</artifacts>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>8.1.5.v20120716</version>
<configuration>
<scanIntervalSeconds>10</scanIntervalSeconds>
<webAppSourceDirectory>${basedir}/target/repository/</webAppSourceDirectory>
<webApp>
<contextPath>/site</contextPath>
</webApp>
</configuration>
</plugin>
</plugins>
</build>
<pluginRepositories>
<pluginRepository>
<id>reficio</id>
<url>http://repo.reficio.org/maven/</url>
</pluginRepository>
</pluginRepositories>
</project>
注意我使用此插件提供LMAX Disruptor(版本3.3.2,编写本文时的最新版本,谢天谢地,可以从Maven Central获得)。
在POM上运行mvn p2:site
。这将在sun.misc
处创建包含{project-folder}/target/repository
片段的p2网站。
此p2存储库 - 以及sun.misc
片段 - 现在可以添加到目标平台,因此可用于Tycho构建。
这应该修复它,并且 - 如果“[你]可以添加[你的]插件本身的任何可能方式”回答你的问题 - 这是唯一可行的方法(我知道)。< / p>
这些来源也可在https://github.com/newcodeontheblock/eclipse-rcp-with-async-logging获得。整个过程也在this - my - blog post about using async Log4j 2 loggers in an Eclipse RCP中详细描述。