Why not login to Qiita and try out its useful features?

We'll deliver articles that match you.

You can read useful information later.

1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【2025嚴】JavaFX ã‚ĸプãƒĒãŽåŽŸčĄŒå¯čƒŊãƒ•ã‚Ąã‚¤ãƒĢ化 (Windows, Eclipse)

Last updated at Posted at 2024-03-24

1: はじめãĢ

æœŦčŗ‡æ–™ã§ã¯ Java ãŒã‚¤ãƒŗã‚šãƒˆãƒŧãƒĢされãĻいãĒã„į’°åĸƒã§ã€Eclipse で開į™ēしたč‡ĒäŊœãƒ—ログナムを .exe ãƒ•ã‚Ąã‚¤ãƒĢとしãĻåŽŸčĄŒã§ãã‚‹ã‚ˆã†ãĢã™ã‚‹æ–šæŗ•ã‚’į´šäģ‹ã—ãĻいぞす。

1-1: å‚č€ƒčŗ‡æ–™

å‚č€ƒčŗ‡æ–™ã¨ã—ãĻį´šäģ‹ã—ãĻã„ã‚‹č¨˜äē‹ã‚’čĒ­ã‚“ã§ã„ãŸã ããŽãŒä¸€į•Ē旊いかと思いぞす。もう少し丁寧ãĢã€ã¨ã„ã†ã“ã¨ã§ãžã¨ã‚į›´ã•ã›ãĻいただきぞした。

1-2: 原æ–Ŋį’°åĸƒ

  • Windows 11 Pro
  • Eclipse 2023-12
  • e(fx)clipse 3.8.0
  • Oracle OpenJDK 21
  • JavaFX 21
  • Launch4j 3.50

2: äŊœæĨ­æ–šæŗ•

2-1: ã‚ĩãƒŗãƒ—ãƒĢ Eclipse プロジェクトãĢついãĻ

ã‚ĩãƒŗãƒ—ãƒĢぎ Eclipse プロジェクト名は「HelloFXSample」です。
これから、「HelloFXSample.exe」としãĻåŽŸčĄŒã§ãã‚‹ã‚ˆã†ãĢしãĻいきぞす。

動äŊœã¯ã€ãƒœã‚ŋãƒŗãŒã‚¯ãƒĒックされたら "Hello JavaFX World!" ã‚’čĄ¨į¤ēã™ã‚‹ã ã‘ãŽå˜į´”ãĒもぎです。

image.png

SampleController.java (ã‚ŗãƒŗãƒˆãƒ­ãƒŧナクナ゚)
package application;

import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.Label;

public class SampleController {
	@FXML private Button button;
	@FXML private Label label;
	
	@FXML void onButtonClicked() {
		label.setText("Hello JavaFX World!");
	}
}
Sample.fxml (ビãƒĨãƒŧ設計)
<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.AnchorPane?>

<AnchorPane prefHeight="200.0" prefWidth="200.0" xmlns="http://javafx.com/javafx/21" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.SampleController">
   <children>
      <Button fx:id="button" layoutX="25.0" layoutY="55.0" mnemonicParsing="false" onAction="#onButtonClicked" text="Button" />
      <Label fx:id="label" layoutX="25.0" layoutY="100.0" text="Label" />
   </children>
</AnchorPane>

2-2: Eclipse プロジェクトぎエク゚ポãƒŧト

exe ãƒ•ã‚Ąã‚¤ãƒĢåŒ–ã—ãŸã„ãƒ—ãƒ­ã‚¸ã‚§ã‚¯ãƒˆã‚’åŗã‚¯ãƒĒックし、エク゚ポãƒŧトを選択しぞす。

image.png

ã€ŒåŽŸčĄŒå¯čƒŊJARãƒ•ã‚Ąã‚¤ãƒĢ」を選択し、æŦĄã¸é€˛ãŋぞす。

image.png

åŋ…čρãĒč¨­åŽšã‚’čĄŒã„ã€JARãƒ•ã‚Ąã‚¤ãƒĢã‚’į”Ÿæˆã—ãžã™ã€‚

é …į›Ž 選択
čĩˇå‹•構成 Main (ドロップダã‚ĻãƒŗãƒĒ゚トãĢある)
エク゚ポãƒŧト先 JAR ãƒ•ã‚Ąã‚¤ãƒĢぎäŋå­˜å…ˆ
ナイブナãƒĒãƒŧå‡Ļᐆ į”Ÿæˆã•ã‚Œã‚‹JARãŽéšŖãŽã‚ĩブフりãƒĢダãƒŧãĢåŋ…須ナイブナãƒĒãƒŧã‚’ã‚ŗãƒ”ãƒŧ

image.png

エク゚ポãƒŧトすると、äŋå­˜å…ˆãĢ JAR ãƒ•ã‚Ąã‚¤ãƒĢと外部ナイブナãƒĒå…ĨりぎフりãƒĢダがäŊœæˆã•れぞす。
image.png

2-3: ã‚ĸプãƒĒåŽŸčĄŒį”¨ãŽæœ€å°æ§‹æˆ JRE をäŊœæˆã™ã‚‹

Java ãŽåŽŸčĄŒãĢは JRE (Java Runtime Environment) がåŋ…čĻã§ã™ã€‚é–‹į™ēį’°åĸƒãŽ JRE ã‚’ããŽãžãžã‚ŗãƒ”ãƒŧしãĻも動äŊœã—ãžã™ãŒã€é…å¸ƒį”¨ãĒぎで、ãĒるずく最小限ぎã‚ĩイã‚ēãĢしたいということで、最小構成ぎ JRE をäŊœæˆã—ぞす。

2-3-1: jdeps ãĢよるãƒĸジãƒĨãƒŧãƒĢぎ䞝存é–ĸäŋ‚ぎįĸēčĒ

jdeps ã‚ŗãƒžãƒŗãƒ‰ã‚’äŊŋい、ãƒĸジãƒĨãƒŧãƒĢぎ䞝存é–ĸäŋ‚ã‚’įĸēčĒã—ãžã™ã€‚jdeps ã‚ŗãƒžãƒŗãƒ‰ã¯ JDK ãĢåĢぞれãĻã„ã‚‹ãŸã‚ã€ãƒ‘ã‚šãŒé€šãŖãĻã„ã‚Œã°åˆŠį”¨ã§ããžã™ã€‚

ã‚ŗãƒžãƒŗãƒ‰æ›¸åŧ
> jdeps --module-path [JavaFX SDK ぎ lib ãƒ‡ã‚ŖãƒŦクトãƒĒ] -s [JAR ãƒ•ã‚Ąã‚¤ãƒĢ]

--module-path ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗãŽ [JavaFX SDK ぎ lib ãƒ‡ã‚ŖãƒŦクトãƒĒ] ãĢã¯ã€ã‚¤ãƒŗã‚šãƒˆãƒŧãƒĢしãĻいるはずぎ JavaFX SDK ぎ lib ãƒ‡ã‚ŖãƒŦクトãƒĒãŽãƒ‘ã‚šã‚’æŒ‡åŽšã—ãžã™ã€‚č¤‡æ•°ãƒ‘ã‚šã‚’æŒ‡åŽšã™ã‚‹å ´åˆã¯ ; でåŒēåˆ‡ã‚Œã°č‰¯ã•ãã†ã§ã™ã€‚

image.png

ã“ãĄã‚‰ãŽį’°åĸƒã§ã¯ã€SDK を "C:\pleiades\javafx-sdk-21.0.2" ãĢæ ŧį´ã—ãĻいるぎで、æŦĄãŽã‚ˆã†ãĢ指厚しぞした。

ã‚ŗãƒžãƒŗãƒ‰åŽŸčĄŒäž‹
> jdeps --module-path "C:\pleiades\javafx-sdk-21.0.2\lib" -s HelloFXSample.jar

HelloFXSample -> java.base
HelloFXSample -> javafx.base
HelloFXSample -> javafx.controls
HelloFXSample -> javafx.fxml
HelloFXSample -> javafx.graphics

最小構成 JRE 化するãĢã‚ãŸãŖãĻ、jdeps ã‚ŗãƒžãƒŗãƒ‰ã§åˆ—æŒ™ã•ã‚ŒãŸé …į›Žã‚’ã€æŦĄã§äŊŋう jlink ã‚ŗãƒžãƒŗãƒ‰ãŽ --add-modules ãĢ指厚しぞす。

  • java.base īŧˆä¸čρīŧ‰
  • javafx.base
  • javafx.controls
  • javafx.fxml
  • javafx.graphics īŧˆå‚č€ƒčŗ‡æ–™ãĢよると、不čĻã¨ãŽã“ã¨īŧ‰

č‡ĒäŊœãƒĸジãƒĨãƒŧãƒĢをåĢむ場合

č‡ĒäŊœãƒĸジãƒĨãƒŧãƒĢをåĢむ場合は、æŦĄãŽã‚ˆã†ãĒエナãƒŧがå‡ēるかもしれぞせん。

å¤ąæ•—äž‹
> jdeps --module-path C:\pleiades\javafx-sdk-21.0.2\lib -s HelloFXSample.jar

Exception in thread "main" java.lang.module.FindException: Module ImportedSample2 not found, required by JarImportSample2
        at java.base/java.lang.module.Resolver.findFail(Resolver.java:892)
        at java.base/java.lang.module.Resolver.resolve(Resolver.java:192)
        at java.base/java.lang.module.Resolver.resolve(Resolver.java:141)
        at java.base/java.lang.module.Configuration.resolve(Configuration.java:420)
        at java.base/java.lang.module.Configuration.resolve(Configuration.java:254)
        at jdk.jdeps/com.sun.tools.jdeps.JdepsConfiguration$Builder.build(JdepsConfiguration.java:564)
        at jdk.jdeps/com.sun.tools.jdeps.JdepsTask.buildConfig(JdepsTask.java:607)
        at jdk.jdeps/com.sun.tools.jdeps.JdepsTask.run(JdepsTask.java:561)
        at jdk.jdeps/com.sun.tools.jdeps.JdepsTask.run(JdepsTask.java:537)
        at jdk.jdeps/com.sun.tools.jdeps.Main.main(Main.java:50)

č‡ĒäŊœãƒĸジãƒĨãƒŧãƒĢがあるとき、JAR ãƒ•ã‚Ąã‚¤ãƒĢぎエク゚ポãƒŧト時、JAR ãƒ•ã‚Ąã‚¤ãƒĢãŽéšŖãĢį”Ÿæˆã•ã‚ŒãĻいる īŊžīŊž_lib フりãƒĢダãĢ、䞝存する JAR ãƒ•ã‚Ąã‚¤ãƒĢãŒã‚ŗãƒ”ãƒŧされãĻいぞす。
そこで、 īŊžīŊž_lib ãƒ•ã‚Ąã‚¤ãƒĢも --module-path ãĢ ; でåŒēåˆ‡ãŖãĻ指厚しぞす。
ã‚ŗãƒžãƒŗãƒ‰åŽŸčĄŒį’°åĸƒ (PowerShellãĒお) ãĢã‚ˆãŖãĻは ; ãŒã‚ŗãƒžãƒŗãƒ‰ãŽåŒē切りとしãĻčĒč­˜ã•ã‚ŒãĻしぞうため、ダブãƒĢクりãƒŧトしぞす。

成功䞋
> jdeps --module-path "C:\pleiades\javafx-sdk-21.0.2\lib;HelloFXSample" -s HelloFXSample.jar

HelloFXSample -> ImportedSample2 (č‡ĒäŊœãƒĸジãƒĨãƒŧãƒĢ)
HelloFXSample -> java.base (į„ĄčĻ–ã—ãĻOK)
HelloFXSample -> javafx.base
HelloFXSample -> javafx.controls
HelloFXSample -> javafx.fxml
HelloFXSample -> javafx.graphics (į„ĄčĻ–ã—ãĻOK)

ここでは ImportedSample2 ãƒĸジãƒĨãƒŧãƒĢãĢも䞝存しãĻいることが分かりぞす。

  • ImportedSample2 īŧˆåŋ…čρīŧ‰
  • java.base īŧˆä¸čρīŧ‰
  • javafx.base
  • javafx.controls
  • javafx.fxml
  • javafx.graphics īŧˆå‚č€ƒčŗ‡æ–™ãĢよると、不čĻã¨ãŽã“ã¨īŧ‰

2-3-2: jlink ã‚ŗãƒžãƒŗãƒ‰ãĢよる JRE ぎäŊœæˆ

jlink ã‚ŗãƒžãƒŗãƒ‰ã‚’äŊŋい、配布ã‚ĸプãƒĒã‚ąãƒŧã‚ˇãƒ§ãƒŗå°‚į”¨ãŽ JRE をäŊœæˆã—ぞす。

ã‚ŗãƒžãƒŗãƒ‰æ›¸åŧ
> jlink --module-path [JavaFX ぎ jmods ãƒ‡ã‚ŖãƒŦクトãƒĒ] --add-modules java.base,javafx.base,javafx.controls,javafx.fxml --output jre-min

--module-path ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗãŽ [JavaFX ぎ jmods ãƒ‡ã‚ŖãƒŦクトãƒĒ] ãĢは JavaFX SDK 配布ã‚ĩイトでダã‚Ļãƒŗãƒ­ãƒŧドできる jmods ãƒ•ã‚Ąã‚¤ãƒĢãŽãƒ‡ã‚ŖãƒŦクトãƒĒを指厚しぞす。

image.png

--add-modules ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗãĢは jdeps ã‚ŗãƒžãƒŗãƒ‰ã§čĻ‹ã¤ã‹ãŖãŸäžå­˜é–ĸäŋ‚ぎナイブナãƒĒをã‚ĢãƒŗãƒžåŒē切りで指厚しぞす。

ã‚ŗãƒžãƒŗãƒ‰åŽŸčĄŒäž‹
> jlink --module-path "C:\pleiades\javafx-jmods-21.0.2" --add-modules java.base,javafx.base,javafx.controls,javafx.fxml --output jre-min

ã†ãžãčĄŒã‘ã° jre-min ãƒ‡ã‚ŖãƒŦクトãƒĒãŒį”Ÿæˆã•ã‚ŒãĻいぞす。
image.png

č‡ĒäŊœãƒĸジãƒĨãƒŧãƒĢをåĢむ場合

č‡ĒäŊœãƒĸジãƒĨãƒŧãƒĢをåĢむ場合は、æŦĄãŽã‚ˆã†ãĒエナãƒŧがį™ēį”Ÿã™ã‚‹ã‹ã‚‚ã—ã‚Œãžã›ã‚“ã€‚

å¤ąæ•—äž‹
> jlink --module-path c:\pleiades\javafx-jmod
s-21.0.2\ --add-modules java.base,javafx.base,javafx.controls,javafx.fxml,ImportedSample2 --ou
tput jre-min
エナãƒŧ: Module ImportedSample2 not found
java.lang.module.FindException: Module ImportedSample2 not found
        at java.base/java.lang.module.Resolver.findFail(Resolver.java:892)
        at java.base/java.lang.module.Resolver.resolve(Resolver.java:129)
        at java.base/java.lang.module.Configuration.resolve(Configuration.java:420)
        at java.base/java.lang.module.Configuration.resolve(Configuration.java:254)
        at jdk.jlink/jdk.tools.jlink.internal.Jlink$JlinkConfiguration.resolve(Jlink.java:217)
        at jdk.jlink/jdk.tools.jlink.internal.JlinkTask.createImageProvider(JlinkTask.java:523)
        at jdk.jlink/jdk.tools.jlink.internal.JlinkTask.createImage(JlinkTask.java:411)
        at jdk.jlink/jdk.tools.jlink.internal.JlinkTask.run(JlinkTask.java:286)
        at jdk.jlink/jdk.tools.jlink.internal.Main.run(Main.java:56)
        at jdk.jlink/jdk.tools.jlink.internal.Main.main(Main.java:34)

ã“ãĄã‚‰ã‚‚ jdeps ã‚ŗãƒžãƒŗãƒ‰ãŽã¨ãã¨åŒæ§˜ãĢ --module-path ãĢ īŊžīŊž_lib フりãƒĢダを指厚しぞしょう。そしãĻ、 --add-modules ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗãĢč‡ĒäŊœãƒĸジãƒĨãƒŧãƒĢもčŋŊč¨˜ã™ã‚‹ã“ã¨ã‚’åŋ˜ã‚ŒãĒいようãĢしぞしょう。

成功䞋
> jlink --module-path "c:\pleiades\javafx-jmods-21.0.2\;HelloFXSample_lib/ImportedSample2.jar" --add-modules java.base,javafx.base,javafx.controls,javafx.fxml,ImportedSample2 --output jre-min

įļšããŽæ‰‹é †ã¯ã€åŒã˜æ“äŊœã§äŊœæˆã§ãã‚‹ã¯ãšã§ã™ã€‚

2-4: JARãƒ•ã‚Ąã‚¤ãƒĢを動äŊœįĸēčĒã™ã‚‹

PowerShell ぞたは cmd.exe で JAR ãƒ•ã‚Ąã‚¤ãƒĢをäŋå­˜ã—ãŸãƒ‡ã‚ŖãƒŦクトãƒĒでäŊœæĨ­ã—ぞす。
æŦĄãŽã‚ˆã†ãĒã‚ŗãƒžãƒŗãƒ‰ã§ã€JAR ãƒ•ã‚Ąã‚¤ãƒĢã‹ã‚‰ãƒ—ãƒ­ã‚°ãƒŠãƒ ãŒåŽŸčĄŒã§ãã‚‹ã“ã¨ã‚’įĸēčĒã—ãžã™ã€‚

ã‚ŗãƒžãƒŗãƒ‰æ›¸åŧ
> .\jre-min\bin\java.exe -jar [JAR ãƒ•ã‚Ąã‚¤ãƒĢ]
ã‚ŗãƒžãƒŗãƒ‰åŽŸčĄŒäž‹
> .\jre-min\bin\java.exe -jar HelloFXSample.jar

2-5: EXE ãƒ•ã‚Ąã‚¤ãƒĢãĢ変換する

変換ãĢは Launch4j をäŊŋį”¨ã—ãžã™ã€‚æŦĄãŽã‚ĩイトからダã‚Ļãƒŗãƒ­ãƒŧãƒ‰ã—ã€ã‚¤ãƒŗã‚šãƒˆãƒŧãƒĢしãĻください。

http://launch4j.sourceforge.net/

Basicã‚ŋブではæŦĄãŽã‚ˆã†ãĒč¨­åŽšã‚’čĄŒã„ãžã™ã€‚

č¨­åŽšé …į›Ž č¨­åŽšå†…åŽš
Output file å‡ē力する exe ãƒ•ã‚Ąã‚¤ãƒĢåã‚’č¨­åŽšã—ãžã™ã€‚JRE ã‹ã‚‰į›¸å¯žãƒ‘ã‚šã§æŒ‡åŽšã§ãã‚‹ã‚ˆã† jre-min フりãƒĢダぎæ¨ĒãĢ指厚しぞす。
Jar 変換するJARãƒ•ã‚Ąã‚¤ãƒĢを指厚しぞす

image.png

JREã‚ŋブではæŦĄãŽã‚ˆã†ãĒč¨­åŽšã‚’čĄŒã„ãžã™ã€‚

č¨­åŽšé …į›Ž č¨­åŽšå†…åŽš
JRE paths exe ãƒ•ã‚Ąã‚¤ãƒĢをåŸēæē–ãĢ jre-min ãƒ‡ã‚ŖãƒŦクトãƒĒã‚’į›¸å¯žãƒ‘ã‚šã§æŒ‡åŽšã—ãžã™
Min JRE version åŋ…é ˆé …į›Žã§ã™ã€‚21.0.2 ぎようãĢ Java ぎバãƒŧã‚¸ãƒ§ãƒŗã‚’æŒ‡åŽšã—ãžã™

image.png

最垌ãĢ、į”ģéĸ上部ぎ歯čģŠãƒžãƒŧク (Build Wrapper) ã§č¨­åŽšãƒ•ã‚Ąã‚¤ãƒĢをäŋå­˜ã—ã€åŽŸčĄŒã—ãžã™ã€‚åŽŸčĄŒæ™‚ãŽãƒ­ã‚°ãĢ "Successfully created" があれば成功しãĻいるはずです。

į”ģéĸä¸Šéƒ¨ãŽå†į”Ÿãƒžãƒŧク (Test Wrapper) ã§åŽŸčĄŒã—ãĻ動äŊœã‚’įĸēčĒã—ãžã™ã€‚

äŊœæĨ­ãƒ‡ã‚ŖãƒŦクトãƒĒãĢある、jre-min ãƒ‡ã‚ŖãƒŦクトãƒĒと exe ãƒ•ã‚Ąã‚¤ãƒĢã‚’é…å¸ƒã™ã‚‹ã“ã¨ã§ã€ãŠã“ã§ã‚‚åŽŸčĄŒã§ããžã™ã€‚
ã“ãĄã‚‰ãŽį’°åĸƒã§ã¯ã€lib ãƒ‡ã‚ŖãƒŦクトãƒĒや jar ãƒ•ã‚Ąã‚¤ãƒĢはåŋ…čĻã‚ã‚Šãžã›ã‚“ã§ã—ãŸã€‚
image.png

3: おぞけīŧˆč‡ĒäŊœãƒĸジãƒĨãƒŧãƒĢをåĢむプロジェクトīŧ‰

JavaFX プロジェクトをäŊœæˆã™ã‚‹ã¨ãã€č‡ĒäŊœãƒ—ãƒ­ã‚°ãƒŠãƒ ã‚’ã‚¤ãƒŗãƒãƒŧトしようとしãĻもうぞく動かãĒいことがあるかもしれぞせん。
そしãĻ、原因ぎ一つãĢ、Java 9 から導å…ĨされたãƒĸジãƒĨãƒŧãƒĢã‚ˇã‚šãƒ†ãƒ ãŒã‚ã‚‹ã‹ã‚‚ã—ã‚Œãžã›ã‚“ã€‚

Java 9 ã‹ã‚‰ã¯ãƒ‘ãƒƒã‚ąãƒŧジãĒしīŧˆãƒ‡ãƒ•りãƒĢãƒˆãƒ‘ãƒƒã‚ąãƒŧジīŧ‰ã¯éžæŽ¨åĨ¨ã¨ãĒãŖãĻãŠã‚Šã€ãƒ‘ãƒƒã‚ąãƒŧジãĒしぎ JAR ãƒ•ã‚Ąã‚¤ãƒĢã‚’ã‚¤ãƒŗãƒãƒŧトするとうぞく動かãĒくãĒりぞす。

これからčĒŦæ˜Žã™ã‚‹å¤ąæ•—ã‚’čĩˇã“さãĒいためãĢは、äŊ•ã‹ã—ã‚‰ãŽãƒ‘ãƒƒã‚ąãƒŧジãĢæ‰€åąžã•ã›ã€module_info.java を遊切ãĢ指厚しãĻください。

3-1: å†įžæ‰‹é † (非推åĨ¨ãŽãƒ‡ãƒ•りãƒĢãƒˆãƒ‘ãƒƒã‚ąãƒŧジでäŊœãŖãĻしぞう)

ぞず、EXE ãƒ•ã‚Ąã‚¤ãƒĢ化しようとする Eclipse プロジェクトは、æŦĄãŽã‚ˆã†ãĒ ImportedSample プロジェクトでäŊœæˆã•れた JAR ãƒ•ã‚Ąã‚¤ãƒĢã‚’ã‚¤ãƒŗãƒãƒŧトしãĻいたとしぞす。

3-1-1: ã‚¤ãƒŗãƒãƒŧトされる ImportedSample プロジェクトぎäŊœæˆ

動äŊœã¨ã—ãĻは、main ãƒĄã‚Ŋãƒƒãƒ‰ã‚’åŽŸčĄŒã™ã‚‹ã¨ã€sayHello ãƒĄã‚Ŋッドぎæˆģり値 "Hello.sayHello" ã‚’čĄ¨į¤ēするだけです。

Eclipse プロジェクトぎįŠļ態īŧˆãƒ‡ãƒ•りãƒĢãƒˆãƒ‘ãƒƒã‚ąãƒŧジぎįŠļ態īŧ‰
image.png

Hello.java
public class Hello {
	public static void main(String[] args) {
		System.out.println(sayHello());
	}
	public static String sayHello() {
		return "Hello.sayHello";
	}
}

ImportedSample プロジェクトを、äģ–ぎ Java プロジェクトとしãĻäŊŋえるようãĢ JAR ãƒ•ã‚Ąã‚¤ãƒĢ化しぞす。
JAR ãƒ•ã‚Ąã‚¤ãƒĢ化ぎ手順は、JavaFX プロジェクトぎときと同様ですが、エク゚ポãƒŧト時ぎå‡ĻᐆãĢãĻã€Œį”Ÿæˆã•ã‚Œã‚‹ JAR ãĢåŋ…須ナイブナãƒĒã‚’ãƒ‘ãƒƒã‚ąãƒŧジ」を選択しãĻおきぞす。

image.png

æŦĄãŽã‚ˆã†ãĒã‚ŗãƒžãƒŗãƒ‰ã§ã€į”Ÿæˆã—ãŸ JAR ãƒ•ã‚Ąã‚¤ãƒĢ単äŊ“ぎ動äŊœįĸēčĒã‚’čĄŒã„ãžã™ã€‚

> java -jar ImportedSample.jar
Hello.sayHello (å‡ē力įĩæžœ)

3-1-2: プロジェクトぎäŊœæˆã¨ JAR ãƒ•ã‚Ąã‚¤ãƒĢãŽã‚¤ãƒŗãƒãƒŧト

JAR ãƒ•ã‚Ąã‚¤ãƒĢã‚’ã‚¤ãƒŗãƒãƒŧトする JavaFX プロジェクトをäŊœæˆã—ぞす。
äģŠå›žã¯ JarImportSample という名前でäŊœæˆã—ぞした。

image.png

JarImportSample ぎフりãƒĢダãĢ、先ãģおäŊœæˆã—た JAR ãƒ•ã‚Ąã‚¤ãƒĢã‚’ã‚ŗãƒ”ãƒŧしãĻおきぞす。īŧˆå›ŗã‚’čĻ‹ã‚‹ã¨ãƒ„ãƒĒãƒŧãĢ JAR ãƒ•ã‚Ąã‚¤ãƒĢがčŋŊ加されãĻいるīŧ‰
image.png

ãƒ—ãƒ­ã‚¸ã‚§ã‚¯ãƒˆåã‚’åŗã‚¯ãƒĒック > [ビãƒĢドãƒģパ゚] > [ビãƒĢドãƒģパ゚ぎ構成] を選択しぞす。

image.png

æŦĄãŽã‚ˆã†ãĢプログナムを書き換え、JAR ã§ã‚¤ãƒŗãƒãƒŧトした Hello ã‚¯ãƒŠã‚šã‚’åˆŠį”¨ã—ã‚ˆã†ã¨ã—ãĻãŋぞす。

SampleController.java (ã‚ŗãƒŗãƒˆãƒ­ãƒŧãƒĢクナ゚)
package application;

import Hello;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.Label;

public class SampleController {
	@FXML private Button button;
	@FXML private Label label;
	
	@FXML void onButtonClicked() {
		label.setText(Hello.sayHello());
	}
}

掋åŋĩãĒがら、Hello クナ゚がčĻ‹ã¤ã‹ã‚‰ãĒã„ã¨č¨€ã‚ã‚ŒãĻしぞいぞす。

image.png

3-2: 原因

ã“ãĄã‚‰ã§č§ŖčĒŦされãĻいぞす。īŧˆã™ãŋãžã›ã‚“ã€‚ã‚ãžã‚Šį†č§Ŗã—ãĻいぞせんīŧ‰

3-3: č§Ŗæąēæ–šæŗ•

3-3-1: ã‚¤ãƒŗãƒãƒŧトされる ImportedSample2 プロジェクトぎ再äŊœæˆ

ImportedSample プロジェクトぎäŊœã‚Šæ–šãŒé–“é•ãŖãĻいぞすぎで、ImportedSample2 としãĻäŊœã‚Šį›´ã—ぞす。

æŗ¨æ„į‚šã¨ã—ãĻは、æŦĄãŽã¨ãŠã‚Šã§ã™ã€‚

  • クナ゚はãĒãĢã‹ã—ã‚‰ãŽãƒ‘ãƒƒã‚ąãƒŧジぎ中ãĢつくること
    • äģŠå›žã¯ application2 ãƒ‘ãƒƒã‚ąãƒŧジãĢæ‰€åąžã•ã›ãĻいぞす (わざとåˆĨ名)
    • つぞり、Hello.java は application2 フりãƒĢダぎ中ãĢäŊœæˆã•れãĻいぞす
  • module-info.java をäŊœæˆã™ã‚‹
    • Eclipse ãĒらプロジェクトäŊœæˆæ™‚ぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã§æŒ‡åŽšã§ããžã™
    • ãƒĸジãƒĨãƒŧãƒĢåã¯ã€ãƒ‘ãƒƒã‚ąãƒŧジ名と同じãĢしぞした

image.png

Hello.java ぎ先頭ãĢは package application2; ぎčŋŊ加がåŋ…čĻã§ã™ã€‚

Hello.java
package application2;
public class Hello {
	public static void main(String[] args) {
		System.out.println(sayHello());
	}
	public static String sayHello() {
		return "Hello.sayHello2";
	}
}

module-info.java ãĢは、application ãƒ‘ãƒƒã‚ąãƒŧジぎå…Ŧé–‹č¨­åŽšã‚’æŒ‡åŽšã—ãžã™ã€‚

module-info.java
module ImportedSample2 {
    exports application2;
}

先ãģおと同様ぎ手順で JAR ãƒ•ã‚Ąã‚¤ãƒĢã‚’į”Ÿæˆã—į›´ã—ã€å˜äŊ“で動äŊœįĸēčĒã—ãžã™ã€‚

> java -jar ImportedSample2.jar
Hello.sayHello2 (å‡ē力įĩæžœ)

3-3-2: プロジェクトぎäŊœæˆã¨ JAR ãƒ•ã‚Ąã‚¤ãƒĢãŽã‚¤ãƒŗãƒãƒŧト

うぞく動いたら、JAR ãƒ•ã‚Ąã‚¤ãƒĢを JavaFX プロジェクトでčĒ­ãŋčžŧãŋį›´ã—ãĻãŋぞしょう。
ここでは新しくäŊœã‚Šį›´ã—ãĻ JarImportSample2 としãĻいぞす。

æŦĄãŽã‚ˆã†ãĢプログナムを書き換え、JAR ã§ã‚¤ãƒŗãƒãƒŧトした Hello ã‚¯ãƒŠã‚šã‚’åˆŠį”¨ã—ãžã™ã€‚

SampleController.java (ã‚ŗãƒŗãƒˆãƒ­ãƒŧãƒĢクナ゚)
package application;

import application2.Hello;  // application2 ãƒ‘ãƒƒã‚ąãƒŧジãĢæ‰€åąžã—į›´ã—ãŸãŸã‚
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.Label;

public class SampleController {
	@FXML private Button button;
	@FXML private Label label;
	
	@FXML void onButtonClicked() {
		label.setText(Hello.sayHello());
	}
}

ã“ãŽæ™‚į‚šã§ã¯ã€application2/Hello が存在しãĒã„ã¨č¨€ã‚ã‚ŒãĻしぞいぞす。

image.png

module-info.java ぎ中čēĢをæŦĄãŽã‚ˆã†ãĢ書き換え、ImportedSample2 ãƒĸジãƒĨãƒŧãƒĢをčĒ­ãŋčžŧむようãĢ指厚しぞす。

module-info.java
module JarImportSample2 {
	requires javafx.controls;
	requires javafx.fxml;
	requires ImportedSample2;
	
	opens application to javafx.graphics, javafx.fxml;
}

すると、動くようãĢãĒãŖãĻいるはずです。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up

Comments

No comments

Let's comment your feelings that are more than good

1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Login to continue?

Login or Sign up with social account

Login or Sign up with your email address