【问题标题】:Build Windows RCP Application on Unix Machine在 Unix 机器上构建 Windows RCP 应用程序
【发布时间】:2011-08-03 20:09:33
【问题描述】:

我们正在尝试通过 Hudson/Jenkins 为 RCP 应用程序构建 Eclipse PDE。到目前为止,我们在 Windows 机器(Hudson 在 Windows Server 2003 上运行)上成功地做到了这一点。我们决定将我们的 CI 系统转移到一台 unix 机器上。 在 unix 机器上执行相同的构建时,我们的构建失败并出现以下错误:

!会话 2011-04-12 01:00:49.497 -------------------------------------------------- --------- eclipse.buildId=未知 java.version=1.6.0_23 java.vendor=Sun Microsystems Inc. BootLoader 常量:OS=win32、ARCH=sparc、WS=win32、NL=en_US 框架参数:-application org.eclipse.ant.core.antRunner -buildfile /appl/midw/jenkins/jobs/AP_NAPF/workspace/TP/plugins/org.eclipse.pde.build_3.4.1.R34x_v20081217/scripts/build.xml主要 -Ddummy=true 命令行参数:-ws win32 -os win32 -application org.eclipse.ant.core.antRunner -buildfile /appl/midw/jenkins/jobs/AP_NAPF/workspace/TP/plugins/org.eclipse.pde.build_3.4.1 .R34x_v20081217/scripts/build.xml 主数据 /appl/midw/jenkins/jobs/AP_NAPF/workspace/ap_build/workspace -Ddummy=true !ENTRY org.eclipse.osgi 4 0 2011-04-12 01:00:58.961 !MESSAGE 自动激活捆绑包 org.eclipse.ui.workbench 时发生错误 (687)。 !堆栈 0 org.osgi.framework.BundleException: 用于 bundle org.eclipse.ui.workbench 的激活器 org.eclipse.ui.internal.WorkbenchPlugin 无效 在 org.eclipse.osgi.framework.internal.core.AbstractBundle.loadBundleActivator(AbstractBundle.java:146) 在 org.eclipse.osgi.framework.internal.core.BundleContextImpl.start(BundleContextImpl.java:980) 在 org.eclipse.osgi.framework.internal.core.BundleHost.startWorker(BundleHost.java:346) 在 org.eclipse.osgi.framework.internal.core.AbstractBundle.start(AbstractBundle.java:265) 在 org.eclipse.osgi.framework.util.SecureAction.start(SecureAction.java:400) 在 org.eclipse.core.runtime.internal.adaptor.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:111) 在 org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClass(ClasspathManager.java:427) 在 org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.findLocalClass(DefaultClassLoader.java:193) 在 org.eclipse.osgi.framework.internal.core.BundleLoader.findLocalClass(BundleLoader.java:370) 在 org.eclipse.osgi.framework.internal.core.SingleSourcePackage.loadClass(SingleSourcePackage.java:33) 在 org.eclipse.osgi.framework.internal.core.BundleLoader.findClassInternal(BundleLoader.java:443) 在 org.eclipse.osgi.framework.internal.core.BundleLoader.findClass(BundleLoader.java:399) 在 org.eclipse.osgi.framework.internal.core.BundleLoader.findClass(BundleLoader.java:387) 在 org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass(DefaultClassLoader.java:87) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:248) 在 java.lang.ClassLoader.defineClass1(本机方法) 在 java.lang.ClassLoader.defineClassCond(ClassLoader.java:632) 在 java.lang.ClassLoader.defineClass(ClassLoader.java:616) 在 org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.defineClass(DefaultClassLoader.java:165) 在 org.eclipse.osgi.baseadaptor.loader.ClasspathManager.defineClass(ClasspathManager.java:554) 在 org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findClassImpl(ClasspathManager.java:524) 在 org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClassImpl(ClasspathManager.java:455) 在 org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClass_LockClassLoader(ClasspathManager.java:443) 在 org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClass(ClasspathManager.java:423) 在 org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.findLocalClass(DefaultClassLoader.java:193) 在 org.eclipse.osgi.framework.internal.core.BundleLoader.findLocalClass(BundleLoader.java:370) 在 org.eclipse.osgi.framework.internal.core.BundleLoader.findClassInternal(BundleLoader.java:446) 在 org.eclipse.osgi.framework.internal.core.BundleLoader.findClass(BundleLoader.java:399) 在 org.eclipse.osgi.framework.internal.core.BundleLoader.findClass(BundleLoader.java:387) 在 org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass(DefaultClassLoader.java:87) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:248) 在 org.eclipse.osgi.framework.internal.core.BundleLoader.loadClass(BundleLoader.java:315) 在 org.eclipse.osgi.framework.internal.core.BundleHost.loadClass(BundleHost.java:227) 在 org.eclipse.osgi.framework.internal.core.AbstractBundle.loadBundleActivator(AbstractBundle.java:139) 在 org.eclipse.osgi.framework.internal.core.BundleContextImpl.start(BundleContextImpl.java:980) 在 org.eclipse.osgi.framework.internal.core.BundleHost.startWorker(BundleHost.java:346) 在 org.eclipse.osgi.framework.internal.core.AbstractBundle.start(AbstractBundle.java:265) 在 org.eclipse.osgi.framework.util.SecureAction.start(SecureAction.java:400) 在 org.eclipse.osgi.framework.internal.core.BundleHost.loadClass(BundleHost.java:234) 在 org.eclipse.osgi.framework.internal.core.AbstractBundle.loadClass(AbstractBundle.java:1274) 在 org.eclipse.ant.core.AntCorePreferences$WrappedClassLoader.findClass(AntCorePreferences.java:115) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:307) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:248) 在 org.eclipse.ant.internal.core.AntClassLoader.loadClassPlugins(AntClassLoader.java:69) 在 org.eclipse.ant.internal.core.AntClassLoader.findClass(AntClassLoader.java:47) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:307) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:248) 在 org.eclipse.ant.core.AntRunner.run(AntRunner.java:510) 在 org.eclipse.ant.core.AntRunner.start(AntRunner.java:600) 在 org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:193) 在 org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110) 在 org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79) 在 org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:386) 在 org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 在 java.lang.reflect.Method.invoke(Method.java:597) 在 org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:549) 在 org.eclipse.equinox.launcher.Main.basicRun(Main.java:504) 在 org.eclipse.equinox.launcher.Main.run(Main.java:1236) 在 org.eclipse.equinox.launcher.Main.main(Main.java:1212) 引起:java.lang.NoClassDefFoundError: org/eclipse/swt/SWTError 在 java.lang.Class.getDeclaredConstructors0(本机方法) 在 java.lang.Class.privateGetDeclaredConstructors(Class.java:2389) 在 java.lang.Class.getConstructor0(Class.java:2699) 在 java.lang.Class.newInstance0(Class.java:326) 在 java.lang.Class.newInstance(Class.java:308) 在 org.eclipse.osgi.framework.internal.core.AbstractBundle.loadBundleActivator(AbstractBundle.java:141) ... 61 更多 引起:java.lang.ClassNotFoundException:org.eclipse.swt.SWTError 在 org.eclipse.osgi.framework.internal.core.BundleLoader.findClassInternal(BundleLoader.java:483) 在 org.eclipse.osgi.framework.internal.core.BundleLoader.findClass(BundleLoader.java:399) 在 org.eclipse.osgi.framework.internal.core.BundleLoader.findClass(BundleLoader.java:387) 在 org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass(DefaultClassLoader.java:87) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:248) ... 67 更多 根异常: java.lang.NoClassDefFoundError: org/eclipse/swt/SWTError

在迁移到新的基础设施后,我已经尝试了几件事,但没有成功:

  • 使用 bootclasspath 属性为 PDE 构建使用不同的 rt.jar(来自 Windows JRE)。
  • -os 命令行参数更改为:solaris

是否可以在 Unix 机器上为 Windows 应用程序进行 RCP 构建? 如果是,是否需要在启动 PDE 构建时更改任何参数?

注意:我们使用 pluginbuilder 来设置 PDE 构建。

【问题讨论】:

    标签: eclipse build rcp pde


    【解决方案1】:

    您需要将用于构建的 eclipse 与您与构建放在一起的 eclipse 安装分开。第一个需要对您的构建操作系统是正确的。查看您的 PDE Build 调用。 Eclipse 安装和目标平台有单独的参数。

    【讨论】:

      【解决方案2】:

      您用于执行 PDE 构建的 Eclipse(即 org.eclipse.ant.core.antRunner 应用程序)必须在您的构建服务器环境中可执行。您说您是在 Unix 机器上执行构建,但是 ws 和 os 参数设置为 win32。因此,您似乎在 Unix 构建服务器上使用了 Windows 版本的 Eclipse。这是行不通的,因为 Unix 特定的片段通常在那里不可用(例如 SWT 需要,这就是找不到类 SWTError 的原因)。

      您应该从 eclipse.org 下载特定于您的构建服务器上的环境(操作系统、窗口系统和处理器架构)的 Eclipse,并使用它来运行 PDE 构建。

      【讨论】:

      • 设置 os=solarisws=sgtkarch=sparc 消除了 SWTError。不过,我遇到了下一个障碍:-(。感谢您的回复!
      【解决方案3】:

      下载eclipse delta pack,在开始PDE构建之前将其解压到你的目标eclipse中。

      【讨论】:

      • 不幸的是,在您的目标中包含来自 delta 包的本机库并不意味着当您让 equinox 将特定于平台的构建放在一起时,它们会自动部署。作为一种解决方法,您可以简单地将相应的库(例如 org.eclipse.swt.gtk.linux.x86_64_xxx.jar 用于 linux.gtk.x86_64 构建)从 delta 包的插件目录手动复制到新导出的构建的插件目录中。因为显然这就是捆绑框架的用途。
      猜你喜欢
      • 2019-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-30
      • 1970-01-01
      • 2021-09-08
      • 1970-01-01
      相关资源
      最近更新 更多