我们用Maven和Tycho构建了一个Eclipse插件。然而,目前我们仍然通过一堆手动添加的JAR文件而不是Maven来提供所有的项目依赖。这是由于以下原因:(1)依赖项不能通过标准的Eclipse更新站点获得(至少不能在当前版本中获得),(2)依赖项不能作为捆绑包获得。
这些依赖项中最大的部分是Selenium库(API,远程,特定于浏览器的库及其传递依赖项,例如Guava等)。
我浪费了几个小时,试图在我们的Maven构建过程中拉取这些依赖项。在这个SO问题之后,我尝试了p2-maven-plugin
,创建了一个更新站点,其中包含我的Eclipse目标平台。但是,在运行时,无法加载跨不同 JAR 引用的类(根据我非常有限的 OSGi 知识,我假设,因为清单中缺少一些必要的信息。MF
文件)。下面是尝试创建 RemoteWebDriver
时的问题示例,该驱动程序使用 DesiredCapabilities
类(两个类位于不同的捆绑包中):
Exception in thread "Thread-8" java.lang.NoClassDefFoundError: org/openqa/selenium/remote/DesiredCapabilities
at org.openqa.selenium.remote.RemoteWebDriver.startSession(RemoteWebDriver.java:243)
at org.openqa.selenium.remote.RemoteWebDriver.<init>(RemoteWebDriver.java:126)
at org.openqa.selenium.remote.RemoteWebDriver.<init>(RemoteWebDriver.java:153)
…
Caused by: java.lang.ClassNotFoundException: org.openqa.selenium.remote.DesiredCapabilities cannot be found by org.seleniumhq.selenium.remote-driver_2.45.0
at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:439)
at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:352)
at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:344)
at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:160)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 7 more
在使用p2-maven-plugin
时,还有什么我需要注意的吗?pom.xml
的相关部分如下所示:
<plugin>
<groupId>org.reficio</groupId>
<artifactId>p2-maven-plugin</artifactId>
<version>1.1.1-SNAPSHOT</version>
<executions>
<execution>
<id>default-cli</id>
<configuration>
<artifacts>
<artifact>
<id>org.seleniumhq.selenium:selenium-remote-driver:2.45.0</id>
</artifact>
</artifacts>
</configuration>
</execution>
</executions>
</plugin>
我还用Maven和Tycho构建了一个Eclipse插件。我也有同样的问题:捆绑包<code>org.eclipse.team.svn。核心和org.eclipse.team.svn。ui
无法通过标准Eclipse更新站点获得。
也许你可以尝试这样来解决这类问题:
然后您可以运行Maven构建。
另一种可能性:
有些jar文件可能会坏(如果你用的是Eclipse,那就是老生常谈的hibernate-commons-annotations-4 . 0 . 1 . final . jar;无效的LOC头(错误的签名)?).要检查这种可能性,请尝试手动打开罐子,看看是否可以。
无法使其工作,因此我们现在使用maven-dependency-plugin
和复制依赖
,我们在maven
阶段执行该插件以提取所有必要的依赖项(与我最初的感觉相反,这可以使用
eclipse-pluginpom.xml
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.10</version>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>initialize</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<includeScope>runtime</includeScope>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
然后,Maven依赖项被复制到< code >目标/依赖项
。
唯一的小问题:<code>MANIFEST中的<code>Bundle ClassPath</code>。MF需要手动更新,以防在更新Maven依赖项时JAR文件的名称发生变化(例如commons-io-2.4.JAR
变成commons-io-2.5.JAR
)。
[编辑]关于上面最后一句话,重新审视这个答案:可以通过以下选项方便地剥离版本号:
如何将此WorldEdit依赖项添加到Maven项目中?http://maven.sk89q.com/artifactory/repo/com/sk89q/worldedit/worldedit-bukkit/我需要6.1.1快照。 是否有算法来获取组ID工件ID和版本?
错误:无法初始化主类com.companyname.bank.App,原因是:java.lang.NoClassDefFoundError:org/apache/http/client/ResponseHandler 我在pom.xml文件中添加了依赖项,在/src/lib中也添加了相关的.jar文件之后,这个报告一直出现。真的很困惑,不知道怎么解决。 请帮我一把。谢谢。 以下是我的操作流程: >
问题内容: 如何获取我拥有的jar文件并将其添加到Maven 2的依赖系统中?我将成为此依赖项的维护者,并且我的代码需要在类路径中使用此jar,以便对其进行编译。 问题答案: 您必须分两步执行此操作: 1.给您的JAR一个groupId,artifactId和版本,然后将其添加到您的存储库中。 如果您没有内部存储库,而只是试图将JAR添加到本地存储库,则可以使用任意groupId / artifa
使用 我修改了以包含导入语句。因此,maven无法找到我试图使用并将其与项目链接的jar。 我向pom.xml文件添加了一个依赖项,如下所示:
从我读到的内容来看,我似乎需要一个pom.xml文件。也许我应该先以某种方式将maven添加到项目中?