2017-01-30 22 views
0

Я пытаюсь загрузить javafx в программное обеспечение, основанное на swing, которое следует за реализацией OSGi. Дело в том, что всякий раз, когда я пытаюсь создать какой-либо класс из FX, он дает мне ClassDefNotFoundException.Загрузка javaFx в Apache felix

Я уже пробовал некоторые решения из других сообщений, но ничего не меняется.

Это часть моей POM:

 <plugin> 
      <groupId>org.apache.felix</groupId> 
      <artifactId>maven-bundle-plugin</artifactId> 
      <configuration> 
       <instructions> 
        <Import-Package>!javafx.embed.swing.JFXPanel,*</Import-Package> 
        <Embed-Dependency> 
         *;scope=compile;inline=true, 
         javafx.embed.swing.JFXPanel;scope=compile;inline=true 
        </Embed-Dependency> 
        <Embed-StripVersion>true</Embed-StripVersion> 
       </instructions> 
      </configuration> 
     </plugin> 

Это команда, которая дает мне исключение:

JFXPanel J = new JFXPanel(); 

И это исключение:

Exception in thread "AWT-EventQueue-0" java.lang.NoClassDefFoundError: javafx/embed/swing/JFXPanel 
at br.com.test.SampleTool.<init>(SampleTool.java:87) 
at br.com.test.SampleToolFactory.createDataExplorerView(SampleToolFactory.java:62) 
at org.weasis.base.ui.internal.Activator.dataExplorerChanged(Activator.java:118) 
at org.weasis.base.ui.internal.Activator.lambda$serviceChanged$2(Activator.java:110) 
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311) 
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:756) 
at java.awt.EventQueue.access$500(EventQueue.java:97) 
at java.awt.EventQueue$3.run(EventQueue.java:709) 
at java.awt.EventQueue$3.run(EventQueue.java:703) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80) 
at java.awt.EventQueue.dispatchEvent(EventQueue.java:726) 
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201) 
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116) 
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105) 
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) 
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93) 
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82) Caused by: java.lang.ClassNotFoundException: javafx.embed.swing.JFXPanel 
at java.net.URLClassLoader.findClass(URLClassLoader.java:381) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
at org.apache.felix.framework.ExtensionManager$ExtensionManagerWiring.getClassByDelegation(ExtensionManager.java:1010) 
at org.apache.felix.framework.BundleWiringImpl.searchImports(BundleWiringImpl.java:1595) 
at org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1525) 
at org.apache.felix.framework.BundleWiringImpl.access$400(BundleWiringImpl.java:79) 
at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.loadClass(BundleWiringImpl.java:2018) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
... 18 more 
+0

вы пытались экспортировать пакеты с помощью командной строки Dorg.osgi.framework .system.packages.extra = javafx.embed.swing.JFXPanel, http://felix.apache.org/documentation/subprojects/apache-felix-framework/apache-felix-framework-configuration-properties.html – ravthiru

+0

Я сделал это в аргументах vm на eclipse я также попытался включить класс в файл конфигурации. Может быть, это может быть проблема с IDE? –

ответ

0

Эта инструкция необходимо установить:

<Embed-Dependency> 
*;scope=compile;inline=true, 
javafx.embed.swing.JFXPanel;scope=compile;inline=true 
</Embed-Dependency> 

Код-Dependency работает с артефактов, но javafx.embed.swing.JFXPanel является класс.

Следовательно, вам необходимо указать артефакты, в которых есть все классы JavaFX.

Затем вы должны удалить эту строку:

<Import-Package>!javafx.embed.swing.JFXPanel,*</Import-Package>

Потому что вы хотите импортировать этот класс.

Я считаю, вы ищете что-то вроде этого:

<build> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.felix</groupId> 
       <artifactId>maven-bundle-plugin</artifactId> 
       <extensions>true</extensions> 
       <configuration> 
        <instructions> 
         <Embed-Dependency>groupId=javafx;artifactId=jfxrt;version=8.0;inline=true</Embed-Dependency>        
        </instructions> 
       </configuration> 
      </plugin> 
     </plugins> 
    </build> 
    <dependencies> 
     <dependency> 
      <groupId>javafx</groupId> 
      <artifactId>jfxrt</artifactId> 
      <version>8.0</version> 
      <type>jar</type> 
      <scope>system</scope> 
      <systemPath>${java.home}/lib/ext/jfxrt.jar</systemPath> 
     </dependency> 
    </dependencies> 

В качестве альтернативы, вы можете добавить JavaFX как системные пакеты: like this

+0

Спасибо, что это сработало, ваш ответ был очень полезным. –