我正在寻找处理混合项目类型之间的最佳实践,其中一些项目是Eclipse插件/OSGI捆绑项目(RCP应用程序),而其他项目则只是普通的旧Java项目(Web Services Modules)。 Eclipse插件中很少有对Java项目的依赖性。

我的问题是,至少就我看来,无法在Eclipse PDE环境中干净地表达这种依赖性。我可以将插件项目取决于其他插件项目(通过 Import-Package 或者 Require-Bundle 明显的标题),但没有普通的Java项目。

我似乎能够使项目从工作区中的另一个项目声明对jar的依赖,但是这些jar文件既不会被导出也不会启动配置来拾取(尽管,尽管Java代码编辑的编辑使库可以很好地看到)。

“ Java Projects”用于在J2EE容器(目前JBOSS 4.2.2)上部署的构建服务,并在某些情况下生产多个JAR-用于部署到JBOSS EAR,另一个用于客户代码(AN RCP应用程序)。

我们现在“解决”此问题的方式是,我们还有另外2个外部工具启动器配置 - 一种用于构建所有JAR的配置,另一个用于将这些JAR复制到插件项目中。这起作用(有点),但是“整体构建”和“复制罐”的目标是一个很大的构建步骤,绕过整个Eclipse增量构建功能,并复制罐子,而不仅仅是引用项目,我正在解联依赖关系信息。并要求大量的工作空间刷新,像糖果一样消耗开发时间。

我想拥有的是一个更“天然”的工作空间设置,它将仅在需要时管理项目之间的依赖项,并要求逐步重建,能够在RCP应用程序插件中使用服务库中的客户端代码并能够使用客户代码启动RCP应用程序,并在需要的所有必要类中启动。

所以我也可以吃蛋糕,也可以吃;)

笔记

需要明确的是,目前与依赖关系管理和模块管理有关,而是关于Eclipse PDE配置。

我很清楚[Maven],[Ivy]和[Buckminster]等产品,并且它们解决了一个完全不同的问题(一旦我解决了工作空间配置问题,这些产品实际上可以用上用场来实现工作区并构建工作空间产品)

有帮助吗?

解决方案

我从来没有这样做,所以这是一种理论方法。但是我会尝试使用Ivy或Maven2等依赖关系管理系统。

由于Maven2做得更多,然后只是依赖管理,因此在这种情况下,我建议常春藤。

其他提示

Eclipse项目通过项目属性中的复选框彼此依赖(依赖项目?)哪个是Eclipse如何决定要构建的。您可以自己设置此设置,但是通常是在更改Java构建路径时设置的。它将数据存储在.project File IIRC中,因此,一旦您经过GUI并看到了什么变化,就可以更加灵活地应用其他方式。

但是,听起来您想混合和匹配罐子和捆绑包。这样做的简单方法就是将所有项目视为Java项目。在PDE项目中,您实际上可以进入并调整Java构建路径;它会抱怨并说这不是正确的方法,但是它可以让您拥有一个PDE项目取决于Java项目,而没有所有蓬松的刺痛。话虽如此,如果这种方法存在运行时问题,我不会感到惊讶 - PDE运行时可能不会那样看到它。

另一种方法是使您的罐子本身PDE/OSGI束。毕竟,OSGI捆绑包不过是一个在清单中带有额外升级的罐子,它将让您使用自动依赖关系管理琐碎地开发和组装项目。这可能是最容易选择的,即使您真的不需要捆绑中的清单。但是,这样做将意味着您的PDE应用程序可以使用更模块化的方法来运输,而不是根据需要将库中的库嵌入。

因此,PDE可以生成OSGI捆绑包,这只是JAR +清单内容的另一个名称。您可以在其他环境中以完全相同的方式(例如,用于您的耳朵或其他客户用途),并且可以利用应用程序中的OSGI层。考虑到您正在谈论的混合捆绑包的类型,确实没有理由不这样做。

我们的解决方案使用蚂蚁生成器将普通Java项目的“类”目录直接复制到插件项目的顶级目录中。我们跳过了罐子建筑步骤以节省时间,而且效果很好。如果插件项目取决于已经构建的外部罐子,我们也会将其复制。

这是如何在Eclipse 3.5中设置它的确切方法(对不起,对奇怪的格式进行了设置,但这是我找到保留凹痕的唯一方法):

Create empty "classes" dir in plugin project
Select plugin project, hit F5 to refresh resources
Create new Ant build file in plugin project to copy dependencies (ours is shown below)

Right-click plugin project, select Properties
  Select Builders
  Click "New..." (brings up Edit Configuration dialog)
    Select Ant Builder and click "OK"
    Name your builder (ours is called "PluginProject externals")
    Browse workspace for Buildfile (ours is ${workspace_loc:/PluginProject/copyDependencies.xml})
    click Refresh tab
      check "Refresh resources upon completion", click "Specific resources"
      click "Specify Resources...", check box for the classes dir, click "Finish"
  Click "OK" (closes Edit Configuration dialog)
  Click "Up" to move "PluginProject externals" to top of builder list
Click "OK" (closes Properties dialog)

Open your plugin project's MANIFEST.MF
Click "Runtime" tab
Click "Add..." under "Classpath", select your the "classes" dir and JARs and click "OK"

插件项目中空的“类”目录的手动创建是,因此您可以告诉新的构建器刷新资源(在运行新构建器之前尚不存在)。这是我们的copyDiendencies.xml文件中的内容:xml文件:

<project name="Copy dependencies" default="copyDependencies" basedir=".">
  <!--
    This copying is needed because it appears that Eclipse plugins can't
    depend directly on external Eclipse projects.
  -->
  <description>
    Copies external dependency class andd JAR files into this plugin's directory.
  </description>

  <target name="copyDependencies">
    <copy file="../External/JDOM/jdom-1.0/build/jdom.jar" todir="." preservelastmodified="true"/>
    <copy file="../External/Xalan/xalan-j_2_6_0/bin/xalan.jar" todir="." preservelastmodified="true"/>
    <copy file="../External/Xalan/xalan-j_2_6_0/bin/xercesImpl.jar" todir="." preservelastmodified="true"/>
    <copy file="../External/Xalan/xalan-j_2_6_0/bin/xml-apis.jar" todir="." preservelastmodified="true"/>
    <copy todir="./classes/com/arm" preservelastmodified="true">
      <fileset dir="../Utilities/src/com/arm" excludes="**/*.java"/>
    </copy>
  </target>
  <target name="clean" description="Deletes local copies of external classes and JARs.">
    <delete file="jdom.jar" quiet="true"/>
    <delete file="xalan.jar" quiet="true"/>
    <delete file="xercesImpl.jar" quiet="true"/>
    <delete file="xml-apis.jar" quiet="true"/>
    <delete dir="./classes/com/arm/utilities" quiet="true"/>
  </target>
</project>

这种方法的唯一缺点似乎是Eclipse在需要调用外部构建器时并不是100%完美。

你有我的同情。我也为这个问题和Eclipse Devs的有利墙斗争了一个简单,明显的问题:如何声明从插件到正常Java项目的依赖性(这样它在运行时起作用)?

我认为他们不支持它。我解决问题的唯一方法是在我的插件项目中创建文件夹,这些文件夹实际上是Java项目的垃圾箱/文件夹的链接,然后将这些文件夹包含在插件中。至少有效,但是由于所需的绝对文件系统路径而引起的脆性。

也许您可以在Eclipse上使用“项目属性” - >“部署组件”,并将其他项目添加到主项目中。其他项目类似于自动添加到部署文件(战争,耳朵或其他)中的“罐子”。也许这可以有效。至少对我有用。祝你好运 !!

白羊座。

构建路径属性中有一个“链接源”选项,可让您为项目定义其他源文件夹。您可以选择另一个工作区项目的“ SRC”文件夹,然后将其重命名为“ SRC2”或您想要的任何内容。这样,将类编译并部署到插件项目输出文件夹中,可以在运行时加载。

有了一组复杂的构建依赖性,我发现Maven2和Hudson(CI)是一个非常不错的组合。设置基础架构并让我围绕配置而花了一段时间,但是之后,它就起作用了。

当然,您依赖于Maven2(或Hudson)对您的构建机制的支持。我不确定Eclipse无头的构建得到了多大的支持。但是,如果您使用Eclipse无头的唯一原因是允许在一个地方表达依赖项,请帮自己一个忙并切换。

我遇到了完全相同的问题。我们有一组由Maven构建的多个普通Java项目,应(当前)共享相同的类路径以正常工作。这些项目可用于在非OSGI环境中启动服务器。然后,我们还有一个Eclipse RCP客户端,该客户端将这些项目用作一个捆绑包。我能够使用Apache Felix Maven Bundle插件与Maven一起使用Maven构建这只单物捆,一切正常。但是,每当我更改普通项目中的一个课程时,我都必须重建整个捆绑包。增量构建和资源链接不起作用。

我尝试了将这些项目中的二进制文件/源目录链接到一钉捆绑包的清单类路径的“解决方案”,但它似乎可以正常工作,但这将是一场真正的维护噩梦,因为我什至必须将某些单独的文件链接起来。

具有讽刺意味的是,由于客户在客户端中使用OSGI,我实际上是在考虑将我们的模块化模块与Maven模块折叠成仅一个插件项目的子包。这比发展非常缓慢的发展是更好的选择。

我将首先研究的另一个更好的替代方法(根据OSGI家伙),是将我所有的Maven模块变成Osgi捆绑包。但这可能是一个真正的PITA,因为我依靠类Path扫描并组合了来自多个捆绑包(有时具有相同名称)的多个配置文件以形成一种配置。

(具体地,我们使用弹簧框架,然后将多个持久性合并为一个持久性上下文。我们还合并了来自不同模块的几个Spring XML上下文文件(所有这些方面),应该共同形成一个弹簧上下文,以由Spring使用一个弹簧上下文-dm。)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top