#eclipse #build #rcp #pde
#eclipse #сборка #rcp #pde
Вопрос:
Мы пытаемся выполнить сборку Eclipse PDE для приложения RCP через Hudson / Jenkins. До сих пор мы успешно выполняли это на компьютере с Windows (Hudson работает на Windows Server 2003). Мы решили перенести нашу систему CI на компьютер unix. При выполнении той же сборки на компьютере unix наша сборка завершается сбоем со следующей ошибкой:
!СЕССИЯ 2011-04-12 01:00:49.497 ----------------------------------------------- eclipse.buildId= неизвестно java.версия =1.6.0_23 java.поставщик = Sun Microsystems Inc. Константы загрузчика: 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 main -Ddummy= true Аргументы командной строки: -ws win32 -ос 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 main -data /appl/midw /jenkins/jobs/AP_NAPF/workspace/ap_build/workspace -Ddummy= true !ЗАПИСЬ org.eclipse.osgi 4 0 2011-04-12 01:00:58.961 !СООБЩЕНИЕ Произошла ошибка при автоматической активации пакета org.eclipse.ui.workbench (687). !STACK 0 org.osgi.framework.Исключение BundleException: активатор org.eclipse.ui.internal.WorkbenchPlugin для bundle org.eclipse.ui.workbench недействителен в 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 (собственный метод) в sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) в sun.reflect.Делегирование methodaccessorimpl.invoke(делегирование methodaccessorimpl.java:25) на java.lang.reflect.Метод.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 Исключение Root: java.lang.Ошибка с NoClassDefFoundError: org/eclipse /swt /SWTError
Я уже попробовал пару вещей после перехода на новую инфраструктуру, но безрезультатно:
- Используйте другой rt.jar (исходящее из Windows JRE) для сборки PDE с использованием
bootclasspath
свойства. - Изменение
-os
аргумента командной строки на:solaris
Возможно ли вообще выполнить сборку RCP для приложения Windows на компьютере Unix? Если да, необходимо ли изменять какие-либо параметры при запуске сборки PDE?
Примечание: Мы используем pluginbuilder для настройки сборки PDE.
Ответ №1:
Eclipse, который вы используете для выполнения сборки PDE (то есть приложения org.eclipse.ant.core.antRunner), должен быть исполняемым в среде вашего сервера сборки. Вы сказали, что выполняете сборку на компьютере Unix, но для параметров ws и os установлено значение win32. Похоже, что вы используете версию Eclipse для Windows на вашем сервере сборки Unix. Это не может сработать, поскольку фрагменты, специфичные для Unix, обычно там недоступны (необходимы, например, для SWT, вот почему класс SWTError не найден).
Вы должны загрузить Eclipse с eclipse.org которое специфично для вашей среды на вашем сервере сборки (ОС, оконная система и архитектура процессора) и используйте его для запуска сборки PDE.
Комментарии:
1. Настройка
os=solaris
,ws=sgtk
иarch=sparc
избавился от ошибки SWTError. Однако я натыкаюсь на следующий препятствие на пути:-(. Спасибо за ответ!
Ответ №2:
Загрузите eclipse delta pack, распакуйте его в целевой eclipse перед началом сборки PDE.
Комментарии:
1. К сожалению, включение собственных библиотек из пакета delta в вашу цель не означает, что они будут автоматически развернуты вместе, когда вы разрешите equinox собирать сборки для конкретной платформы. В качестве обходного пути вы можете просто скопировать соответствующую библиотеку (например,
org.eclipse.swt.gtk.linux.x86_64_xxx.jar
дляlinux.gtk.x86_64
сборки) из каталога плагинов delta package в каталог плагинов вашей недавно экспортированной сборки вручную. Потому что, по-видимому, для этого и существует bundle framework.
Ответ №3:
Вам необходимо отделить eclipse, который вы используете для выполнения сборки, от установки eclipse, которую вы собираете вместе со своей сборкой. Первое должно быть правильным для вашей операционной системы сборки. Взгляните на ваш вызов сборки PDE. Существуют отдельные параметры для установки Eclipse и целевой платформы.