JavaFXでMavenをセットアップしようとしています。 MavenとJavaFXの経験が浅かったとしても、それほど大きな挑戦になるとは思っていませんでした。私のJava知識は(Swingを含む)かなり堅実であり、セットアップするのにそれほど困難があるとは思わなかった。
IntelliJ 13.0 Community Editionが提供するJavaFXプロジェクトから始めました。メインクラスのコードは比較的小さいです。
package sample;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
public class Main extends Application
{
@Override
public void start(Stage primaryStage) throws Exception
{
//getClass().getResource("../../resources/sample.fxml");
Parent root = FXMLLoader.load(getClass().getResource("../sample.fxml"));
primaryStage.setTitle("Hello World");
primaryStage.setScene(new Scene(root, 300, 275));
primaryStage.show();
}
public static void main(String[] args)
{
launch(args);
}
}
そして、私のpom.xml
も大きすぎません:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.Apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.Apache.org/POM/4.0.0 http://maven.Apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>sample</groupId>
<artifactId>JavaFXDemo</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<organization>
<name>RubberDucky</name>
</organization>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>com.zenjava</groupId>
<artifactId>javafx-maven-plugin</artifactId>
<version>2.0</version>
</plugin>
</plugins>
</pluginManagement>
<plugins>
<plugin>
<groupId>com.zenjava</groupId>
<artifactId>javafx-maven-plugin</artifactId>
<version>2.0</version>
<configuration>
<mainClass>sample.Main</mainClass>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>com.Oracle</groupId>
<artifactId>javafx</artifactId>
<version>2.2</version>
<systemPath>${Java.home}/lib/jfxrt.jar</systemPath>
<scope>system</scope>
</dependency>
</dependencies>
</project>
JavaFX Maven Plugin を使用してアプリケーションをビルドしています。 mvn clean jfx:jar
を実行すると、すべてが正常に見えるようになり、すべてのビルドが成功します。しかし、アプリケーションを実行しようとすると、次のエラーが表示されます。
Exception in Application start method
Java.lang.reflect.InvocationTargetException
at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at Sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at Sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at Java.lang.reflect.Method.invoke(Unknown Source)
at com.javafx.main.Main.launchApp(Main.Java:698)
at com.javafx.main.Main.main(Main.Java:871)
Caused by: Java.lang.RuntimeException: Exception in Application start method
at com.Sun.javafx.application.LauncherImpl.launchApplication1(Unknown So
urce)
at com.Sun.javafx.application.LauncherImpl.access$000(Unknown Source)
at com.Sun.javafx.application.LauncherImpl$1.run(Unknown Source)
at Java.lang.Thread.run(Unknown Source)
Caused by: Java.lang.NullPointerException: Location is required.
at javafx.fxml.FXMLLoader.load(Unknown Source)
at javafx.fxml.FXMLLoader.load(Unknown Source)
at javafx.fxml.FXMLLoader.load(Unknown Source)
at javafx.fxml.FXMLLoader.load(Unknown Source)
at javafx.fxml.FXMLLoader.load(Unknown Source)
at sample.Main.start(Main.Java:15)
at com.Sun.javafx.application.LauncherImpl$5.run(Unknown Source)
at com.Sun.javafx.application.PlatformImpl$5.run(Unknown Source)
at com.Sun.javafx.application.PlatformImpl$4$1.run(Unknown Source)
at com.Sun.javafx.application.PlatformImpl$4$1.run(Unknown Source)
at Java.security.AccessController.doPrivileged(Native Method)
at com.Sun.javafx.application.PlatformImpl$4.run(Unknown Source)
at com.Sun.glass.ui.InvokeLaterDispatcher$Future.run(Unknown Source)
at com.Sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.Sun.glass.ui.win.WinApplication.access$100(Unknown Source)
at com.Sun.glass.ui.win.WinApplication$3$1.run(Unknown Source)
... 1 more
いくつかの大まかなデバッグの後、問題はファイルのロード元のパスにあるようです。 sample.fxml
をハードドライブ上の場所にハードコーディングした後、アプリケーションは問題なく実行されます。 IntelliJからアプリケーションを実行する場合、現在の設定(上記を参照)についても同様です。
すべてのリソース(StackOverflow、非常によく似たエラーを含む)を使い果たしたように感じますが、正確に何が間違っているのかわかりません。
_sample.fxml
_が_src/main/resources/
_ディレクトリ(またはサブディレクトリ)にあることを確認してください。その後、次のようにしてファイルにアクセスできます。
_Parent root = FXMLLoader.load(getClass().getClassLoader().getResource("sample.fxml"));
_
説明:コンパイル段階で、すべてのリソースとクラスが_target/classes/
_にコピーされます。したがって、fxmlファイルはこのディレクトリにあり、クラスはパッケージ名に関するサブディレクトリにあります。 getClass().getResource("sample.fxml");
を呼び出すと、ファイルはこのディレクトリになるクラスファイルに関連して検索されます:_target/classes/sample/
_。
クラスローダーで.getResource()
を呼び出すと、相対検索パスが_target/classes/
_に設定されるため、ファイルが見つかります。
追伸次のように書くこともできます。
_Parent root = FXMLLoader.load(getClass().getResource("/sample.fxml"));
_
@ Absurd-Mindで既に説明したように、mavenはsrc
ディレクトリの下にあるリソースファイル(fxmlなど)をコピーしません。
Javaソースファイル以外にfxml
ファイルを保持する場合は、mavenリソースプラグインを使用してコピーできます。
<build>
...
<resources>
<resource>
<filtering>false</filtering>
<directory>src/main/Java</directory>
<includes>
<include>**/*.fxml</include>
</includes>
</resource>
</resources>
...
</build>
IntelijとGradleでも同じ問題がありました。
修正手順:
1.ファイルを移動する
sample.fxml
パスへ
\ src\main\resources\fxml
親ルート= FXMLLoader.load(getClass()。getResource( "/ fxml/sample.fxml"));
ビルドシステムとしてgradleを使用する場合は、これをbuild.gradle
ファイルに追加します。
sourceSets.main.resources {
srcDirs = ["src/main/Java"]; //assume that your Java classes are inside this path
exclude "**/*.Java"
}
次に、プロジェクトをクリーニングして再構築します。
それで何をしますか? view.fxml
パッケージ内にcom.example.myfxapp
がある場合、プロジェクトをビルドした後、<build dir>/resources/com/example/myfxapp/view.fxml
にエクスポートされます
私にとって、私は次のことを大事にしていました-
メインクラスが存在する場所にfxmlファイルが配置されていることを確認してください。そして、これを使用してロードします-(私の場合、TechJFX.fxmlはファイルです)
FXMLLoader loader = new FXMLLoader(getClass().getResource("TechJFX.fxml"));
Opencv-*。jarをプロジェクトフォルダーに追加します(私の場合はopencv-300.jar)
Jarを使用してビルドパスに追加します
プロジェクトフォルダーを右クリック->ビルドパス->ビルドパスの構成->ライブラリタブ->外部JARの追加とjarの検索
また、Order and Export-> opencv-300.jarおよびJRE System Libraryにチェックマークを付けます(まだチェックしていない場合)。
Opencv_Java * .dll(私の場合はopencv_Java300.dll)を、プロジェクトフォルダー内のjarと同じ場所にコピーします。
次のメソッドをメインクラスに追加します
static{
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
}
できた.
これが同様の問題に直面している人の助けになることを願っています。