【问题标题】:How to build Eclipse plugin project with dependency on Eclipse Birt?如何构建依赖于 Eclipse Birt 的 Eclipse 插件项目?
【发布时间】:2014-09-25 10:01:30
【问题描述】:

我有一组 Maven 项目想要迁移到 SBT。

唯一阻止我这样做的原因是,它是一个 Eclipse 插件项目,它依赖于 Eclipse Birt。

Maven 的Tycho plugin 处理所有依赖项。此工具在 SBT 中不可用。我找到了 SBT 的 sbt-tycho 插件,但它看起来没有维护(3 年没有活动)。

也许我可以使用 Maven 构建我的 Eclipse 插件,并使用 SBT 构建其余项目。但不知道这是否可行。

其他替代方法是通过the wuff plugin 使用Gradle。

StackOverflow 中的相关问题:

但在 Maven 或 Gradle 之前,我更喜欢 SBT,以免引入除 Scala 之外的另一种语言。

除了使用 Tycho(Eclipse 插件)的项目外,是否可以在 SBT 中拥有所有项目? Eclipse插件项目是主项目的依赖,很少改动。

有什么想法吗?

更新 1:附加信息。 Eclipse 插件使用p2 repository 格式来处理依赖关系,而不是用于 Gradle、Maven、Ivy 和 SBT 的标准 Maven 存储库。这就是为什么需要特殊工具的原因。我的自定义 Eclipse 插件有 100 多个间接 p2 依赖项。

更新 2

pom.xml 我的 Eclipse 插件:

<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
    <groupId>myCompany</groupId>
  <artifactId>myPlugin</artifactId>
    <version>1.0.0-SNAPSHOT</version>
  <packaging>eclipse-plugin</packaging>
  <properties>
    <tycho.version>0.19.0</tycho.version>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <repositories>
    <repository>
      <id>eclipse</id>
      <url>http://download.eclipse.org/releases/kepler</url>
      <layout>p2</layout>
    </repository>
    <repository>
      <id>babel</id>
      <url>http://download.eclipse.org/technology/babel/update-site/R0.11.1/kepler</url>
      <layout>p2</layout>
    </repository>
    <repository>
      <id>logback</id>
      <url>http://logback.qos.ch/p2/</url>
      <layout>p2</layout>
    </repository>
  </repositories>

  <build>
    <plugins>
      <plugin>
        <groupId>org.eclipse.tycho</groupId>
        <artifactId>tycho-maven-plugin</artifactId>
        <version>${tycho.version}</version>
        <extensions>true</extensions>
      </plugin>

      <plugin>
        <groupId>org.eclipse.tycho</groupId>
        <artifactId>target-platform-configuration</artifactId>
        <version>${tycho.version}</version>
        <configuration>
      <resolver>p2</resolver>
      <environments>
              <environment>
                <os>linux</os>
                <ws>gtk</ws>
                <arch>x86_64</arch>
              </environment>
              <environment>
                <os>win32</os>
                <ws>win32</ws>
                <arch>x86</arch>
              </environment>
      </environments>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

【问题讨论】:

  • 您能否详细说明“也许我可以使用 Maven 构建我的 Eclipse 插件,而其他项目则使用 SBT。但不知道这是否可能。”?确实可以在一个项目中使用 Maven 而在其他项目中使用 sbt。您还想保留目录结构吗?结构应该如何?
  • 目录结构可以根据需要更改。
  • 其他项目何时需要Eclipse插件项目?它们之间有什么关系?
  • 有一个主项目和几个附属项目。其中一个卫星是 Eclipse 插件,它为 Eclipse Birt 提供自定义数据。主项目使用与卫星项目相同的 Eclipse Birt 插件。因此,使用自定义 Eclipse 插件的传递依赖,带来所有需要的 Birt 依赖。问题在于 Eclipse 插件使用自定义存储库布局:“p2”而不是标准 Maven 布局。
  • 啊,那么真正的问题是 p2 存储库布局吗?那是什么?

标签: eclipse-plugin sbt tycho


【解决方案1】:

看来the support for Eclipse updatesite with OSGi bundles is already available in Ivy。然而,这并不意味着解析器可以直接在 sbt 中使用(我之前从未阅读过它并在使用过它,所以我可能会弄错)。

有一种方法可以使用 externalIvySettings() 在 sbt 中包含任何 Ivy 解析器:

像为 Maven (pom.xml) 或 Ivy 一样创建配置文件 (ivy.xml 和可选的ivysettings.xml)。外部配置是 使用以下表达式之一选择。

Ivy settings (resolver configuration)externalIvySettingsIvy file (dependency configuration)externalIvyFile

我的猜测是,利用支持您可能会非常成功。只需将externalIvySettings 和/或externalIvyFile 添加到build.sbt,并在Eclipse 插件项目的顶级目录中创建ivy.xml,并声明Ivy's Eclipse updatesite resolver

您可能想通过以下build.sbt 探索支持:

externalIvySettings()

libraryDependencies += "bundle" % "org.eclipse.swt.cocoa.macosx.x86_64" % "3.100.1.v4234e"

ivysettings.xml 放在项目的顶级目录中(与build.sbt 并排):

<ivysettings>
  <settings defaultResolver="chain"/>
  <resolvers>
    <chain name="chain">
      <ibiblio name="central" m2compatible="true"/>
      <updatesite name="eclipse-juno" url="http://download.eclipse.org/releases/juno" />
    </chain>
  </resolvers>
</ivysettings>

使用上面的两个文件,我可以 update 直到在某些 packages 上失败:

> update
[info] Updating {file:/Users/jacek/sandbox/eclipse-p2/}eclipse-p2...
:: loading settings :: file = /Users/jacek/sandbox/eclipse-p2/ivysettings.xml
[warn]  module not found: package#org.eclipse.swt.accessibility2;[0.0.0,)
[warn] ==== central: tried
[warn]   http://repo1.maven.org/maven2/package/org.eclipse.swt.accessibility2/[revision]/org.eclipse.swt.accessibility2-[revision].pom
[warn]   -- artifact package#org.eclipse.swt.accessibility2;[0.0.0,)!org.eclipse.swt.accessibility2.jar:
[warn]   http://repo1.maven.org/maven2/package/org.eclipse.swt.accessibility2/[revision]/org.eclipse.swt.accessibility2-[revision].jar
[warn] ==== eclipse-juno: tried
[warn]  module not found: package#org.mozilla.xpcom;[0.0.0,)
[warn] ==== central: tried
[warn]   http://repo1.maven.org/maven2/package/org.mozilla.xpcom/[revision]/org.mozilla.xpcom-[revision].pom
[warn]   -- artifact package#org.mozilla.xpcom;[0.0.0,)!org.mozilla.xpcom.jar:
[warn]   http://repo1.maven.org/maven2/package/org.mozilla.xpcom/[revision]/org.mozilla.xpcom-[revision].jar
[warn] ==== eclipse-juno: tried
[warn]  ::::::::::::::::::::::::::::::::::::::::::::::
[warn]  ::          UNRESOLVED DEPENDENCIES         ::
[warn]  ::::::::::::::::::::::::::::::::::::::::::::::
[warn]  :: package#org.eclipse.swt.accessibility2;[0.0.0,): not found
[warn]  :: package#org.mozilla.xpcom;[0.0.0,): not found
[warn]  ::::::::::::::::::::::::::::::::::::::::::::::
[warn]
[warn]  Note: Unresolved dependencies path:
[warn]      package:org.eclipse.swt.accessibility2:[0.0.0,)
[warn]        +- bundle:org.eclipse.swt:[3.0.0,4.0.0)
[warn]        +- bundle:org.eclipse.swt.cocoa.macosx.x86_64:3.100.1.v4234e (/Users/jacek/sandbox/eclipse-p2/build.sbt#L3-4)
[warn]        +- default:eclipse-p2_2.10:0.1-SNAPSHOT
[warn]      package:org.mozilla.xpcom:[0.0.0,)
[warn]        +- bundle:org.eclipse.swt:[3.0.0,4.0.0)
[warn]        +- bundle:org.eclipse.swt.cocoa.macosx.x86_64:3.100.1.v4234e (/Users/jacek/sandbox/eclipse-p2/build.sbt#L3-4)
[warn]        +- default:eclipse-p2_2.10:0.1-SNAPSHOT

【讨论】:

  • 谢谢雅克。有时间我会试着告诉你。
  • 这太棒了,因为该地区的探索不多(而且由于我是新手,我会很感激任何帮助)。谢谢!
  • 它不起作用,我在org.apache.ivy.core.resolve.ResolveEngine.resolve(ResolveEngine.java:336) 收到java.lang.ArrayIndexOutOfBoundsException: 0。我喜欢这个解决方案,因为它很简单。
  • 你使用的是什么 sbt 版本?由于Ivy出现问题,与你使用的版本有关。
  • Ivy 团队已经帮我解决了这个 bug,但是我尝试过用 SBT 的更正版本,它太新了,并且发生了一些 API 更改。
【解决方案2】:

另一个解决方案(我还没有尝试过)是使用为此目的而设计的sbt-osgi-manager 插件。它是积极维护的。

我会根据我的经验更新这个答案。

更新:第一次尝试时它对我不起作用。

最终的解决方案是为 Birt 插件使用标准的 Maven 存储库。此解决方案适用于嵌入 Birt 运行时,但不适用于完整的 RCP 应用。

【讨论】:

  • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。
  • 编辑并在答案中放置了插件的名称。如果 URL 发生变化,可以用 google 搜索。
猜你喜欢
  • 2012-04-22
  • 1970-01-01
  • 2013-11-16
  • 1970-01-01
  • 1970-01-01
  • 2015-02-18
  • 2012-01-20
  • 2012-06-16
  • 1970-01-01
相关资源
最近更新 更多