2012-11-05 5 views
7

OSGi 번들에서 JavaFX 2.2를 사용하려면 어떻게해야합니까? Apache Felix를 사용하고 있으므로 eclispe 프로젝트가 아닙니다. Java7이 설치된 Mac OSX에서 실행해야합니다 (Java6은 멋지지만 반드시 필요한 것은 아닙니다).OSGi 번들에서 JavaFX 2.2 사용

저는 jfx 라이브러리를 재 포장하는 것에 대해 읽었지만 eclispe 플러그인 프로젝트는 읽었습니다.

번들 Manifest에서 javafx 패키지를 가져 오면 누락 된 요구 사항 osgi.wiring.package Exception이 작성되었습니다.

답변

7

JavaFX가 OSGi 환경에서 잘 작동하도록하는 라이브러리가 포함 된 e (fx) 클립 실행 도구를 사용해보십시오.

에 따르면 e(fx)clipse site :

자바 FX-바이너리가 사용자에 어딘가에있는 사실에 이르기까지은 OSGi 내에서 실행할 때 문제를 일으키는 다양한 장소가 불행하게도 자바 FX는 마음은 OSGi에 기록되지 않습니다 시스템을 OSGi의 가시성 규칙 때문에 클래스 로딩과 관련하여 문제가 될 수 있습니다. 이 SWT로하고

+1

하지만 SWT와 일식 춘분을 사용하지는 않습니다. 그러한 OSGi 도우미 라이브러리를 만드는 더 일반적인 방법이 없습니까? – chrise

+1

[e (fx) clipse 포럼] (https://groups.google.com/forum/m/?fromgroups#!forum/efxclipse)에 대한 질문이 있습니다. – jewelsea

+1

OSGi 번들의 JavaFX는 여전히 약간 까다 롭습니다. . e (fx) clipse 플러그인은 춘분과 함께 작동하지만 아파치 펠릭스 (Felix)에서 작동하지 않았기 때문에 javafx 클래스를 osgi 번들이 아닌 boot-classloader에 추가해야했습니다. 추가 FX 버전이 여기에서 향상되기를 바랍니다. – chrise

6

하지 자바 FX와 번들 스윙하지만 같은 전자는 (FX)는 clipse 이클립스 춘분의 ontop을 쉽게 같은 느낌을 자바 FX 애플리케이션을 모든 문제를 해결하는 도우미 라이브러리를 제공하고 작성하게 자바 FX 클래스를 추가 부트 클래스 로더가 작동 할 것입니다. 아파치 펠릭스와 예 : (자바 FX는 클라이언트 컴퓨터에 설치되어있는 경우)

Map<String,String> properties = new HashMap<String, String>(); 
properties.put(Constants.FRAMEWORK_BOOTDELEGATION, "javafx.*,com.sun.javafx.*"); 
properties.put(Constants.FRAMEWORK_BUNDLE_PARENT, Constants.FRAMEWORK_BUNDLE_PARENT_APP); 

FrameworkFactory factory = new org.apache.felix.framework.FrameworkFactory(); 
org.osgi.framework.launch.Framework framework = factory.newFramework(properties); 
framework.init(); 

지금 그냥 번들에서 자바 FX 클래스를 사용합니다.

+0

좋은 접근 방법입니다. OSGI 컨테이너 설정을 수정하고 여분의 코드를 필요로하지 않으면 서이 작업을 수행 할 수 있습니까? –

+0

Apache Karaf 사용자는/etc 디렉토리에서 jre.properties 파일을 수정할 수 있습니까? –

11

그것은 아마도 당신을 도울 조금 늦게,하지만 난 경우 누구의 OSGi 프레임 환경 내에서 자바 FX를 가능하게하는 간단한 방법을 문서화하고 싶은, 나처럼, 여전히 문제가 그 일을했다 ....

문제는 JavaFX가 원하는 클래스를로드하고 사용할 수 있어야한다는 것입니다 (JavaFX는 JRE의 내부를 사용하여 번들로 만들기가 어렵습니다). 그래서 실제로 원하는 것은 OSGi에 액세스 권한을 부여하는 것입니다 클래스 패스 추가 ...

저는이 블로그에서 SpringSource의 Costin Leau가 어떻게하는지 설명합니다 (JavaFX뿐만 아니라 시스템 클래스 로더에 대한 완전한 액세스를 가정하는 모든 항아리에 대해). 다른 방법들:

org.osgi :

http://blog.springsource.org/2009/01/19/exposing-the-boot-classpath-in-osgi/

나는 기본적 OSGi 컨테이너의 config 파일에서 OSGi에서 지정된 속성 (! 어떤 구현에 특정되지 않음)를 설정하는 것을 의미 옵션 A를 사용하기로 결정했습니다 .framework.system.packages.extra = javafx.application, 버전 = 0.0.0 ...

당신이 요점에서 속성의 전체 값을 볼 수 있습니다 나는 핸드 크림을했습니다 테드 :

https://gist.github.com/renatoathaydes/5021107

나는 기본적으로 자바 FX 2.2 항아리 내보낼 수있는 모든 패키지와 설정 (그리고 나는 단순히 내 아파치 Karaf의 배포 폴더에 자바 FX 항아리를 놓아이 발견 자동적하는 번들로 만든 다음 생성 된 Manifest를 살펴 본다.)그런데 Karaf (pax-wrap을 사용하여 생성)에서 생성 된 번들을 사용하려고 시도했지만 JavaFX가 클래스를로드하려고 시도하는 방식으로 인해 작동하지 않습니다 (시도 된 JavaFX 번들에서는 보이지 않습니다. JavaFX가 액세스하려고하는 모든 JRE 패키지는 말할 것도 없습니다).

내가 추가 한 패키지가 실제로 필요한 것은 아니지만 안전함을 기하기 위해 Karaf의 래퍼에 의해 생성 된대로 모두 남겨 뒀다. 제대로 작동하지 않는 한 변경하지 않을 것이다.

JFXrt.jar이 JRE lib 폴더에있는 한 모든 번들에서 JavaFX를 사용할 수 있습니다.

+0

OSGi 외부에서 오는 패키지의 버전이 지정되지 않았기 때문에 버전이 0.0.0으로 선언되므로 '비어있는'버전 번호 만 지정하면됩니다. – Renato

관련 문제