java - मावेन शेड जावाएफ़एक्स रनटाइम घटक गायब हैं
maven javafx (1)
यह answer बताता है कि जावाएफएक्स 11 पर एक वसा / उबेर जार विफल क्यों होता है। संक्षेप में:
यह त्रुटि java.base मॉड्यूल में sun.launcher.LauncherHelper से आती है। इसका कारण यह है कि मुख्य एप्लिकेशन अनुप्रयोग का विस्तार करता है और इसकी एक मुख्य विधि है। यदि ऐसा है, तो LauncherHelper
javafx.graphics
मॉड्यूल के लिए एक नामित मॉड्यूल के रूप में उपस्थित होने के लिए जाँच करेगा। यदि वह मॉड्यूल मौजूद नहीं है, तो लॉन्च रद्द कर दिया गया है।
और ग्रैडल के लिए पहले से ही एक प्रस्ताव प्रस्तावित करता है।
मावेन के लिए समाधान बिल्कुल समान है: एक नया मुख्य वर्ग प्रदान करें जो
Application
से विस्तारित नहीं होता है।
आपके
application
पैकेज में नया वर्ग होगा (बुरा नाम):
// NewMain.java
public class NewMain {
public static void main(String[] args) {
Main.main(args);
}
}
और आपका मौजूदा
Main
वर्ग, जैसा है:
//Main.java
public class Main extends Application {
@Override
public void start(Stage stage) {
...
}
public static void main(String[] args) {
launch(args);
}
}
अब आपको अपने पॉम को संशोधित करने और विभिन्न प्लगइन्स के लिए अपना मुख्य वर्ग सेट करने की आवश्यकता है:
<mainClass>application.NewMain</mainClass>
प्लेटफ़ॉर्म-विशिष्ट फैट जार
अंत में, शेड प्लगइन के साथ आप अपनी मशीन पर एक मोटी जार का उत्पादन करने जा रहे हैं।
इसका मतलब है कि, अब तक, आपके JavaFX निर्भरताएं एक अद्वितीय क्लासिफायरियर का उपयोग कर रही हैं।
यदि उदाहरण के लिए आप विंडोज पर हैं, तो मावेन आंतरिक रूप से
win
क्लासिफायरियर का उपयोग करेगा।
इसमें विंडोज के लिए केवल मूल पुस्तकालयों को शामिल करने का प्रभाव है।
तो आप उपयोग कर रहे हैं:
- org.openjfx: JavaFX-नियंत्रण: 11
- org.openjfx: JavaFX-नियंत्रण: 11: जीत
- org.openjfx: JavaFX-ग्राफिक्स: 11
- org.openjfx: javafx-graphics: 11: win <- इसमें विंडोज के लिए देशी dll शामिल हैं
- org.openjfx: JavaFX आधार: 11
- org.openjfx: JavaFX आधार: 11: जीत
अब, यदि आप वसा जार का उत्पादन करते हैं, तो आप उन सभी आश्रितों (और आपकी परियोजना से अन्य नियमित तृतीय पक्ष निर्भरता) को बंडल करेंगे, और आप अपनी परियोजना को चलाने में सक्षम होंगे:
java -jar myFatJar-1.0-SNAPSHOT.jar
हालांकि यह बहुत अच्छा है, अगर आप जार वितरित करना चाहते हैं, तो ध्यान रखें कि यह जार क्रॉस-प्लेटफॉर्म नहीं है, और यह आपके प्लेटफॉर्म पर ही काम करेगा, इस मामले में विंडोज।
क्रॉस-प्लेटफ़ॉर्म फैट जार
एक क्रॉस-प्लेटफ़ॉर्म जार उत्पन्न करने के लिए एक समाधान है जिसे आप वितरित कर सकते हैं: अन्य प्लेटफार्मों के बाकी देशी पुस्तकालयों को शामिल करें।
यह आसानी से किया जा सकता है, जैसा कि आपको तीन प्लेटफार्मों के लिए ग्राफिक्स मॉड्यूल निर्भरता को शामिल करने की आवश्यकता है:
<dependencies>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-controls</artifactId>
<version>11</version>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-graphics </artifactId>
<version>11</version>
<classifier>win</classifier>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-graphics </artifactId>
<version>11</version>
<classifier>linux</classifier>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-graphics </artifactId>
<version>11</version>
<classifier>mac</classifier>
</dependency>
</dependencies>
आकार
इस दृष्टिकोण के साथ एक मुख्य मुद्दा है: आकार। जैसा कि आप इस अन्य answer में देख सकते हैं, यदि आप वेबव्यू नियंत्रण का उपयोग करते हैं, तो आप वेबकिट देशी पुस्तकालयों के कारण 220 एमबी के आसपास बंडल करेंगे।
मैं मावेन निर्भरता का उपयोग करके एक JFX11 स्व-युक्त जार बनाने की कोशिश कर रहा हूं। मेरे द्वारा किए गए शोध से, ऐसा करने का सबसे अच्छा तरीका मावेन शेड प्लगइन है। हालाँकि, जब मैं इसे चलाता हूं, मुझे यह त्रुटि मिलती है:
त्रुटि: JavaFX रनटाइम घटक गायब हैं, और इस एप्लिकेशन को चलाने के लिए आवश्यक हैं
मुझे समझ नहीं आता कि ऐसा क्यों हो रहा है। मैं क्या गड़बड़ कर रहा हूं? क्या ऐसा करने के लिए इससे अच्छा तरीका है? मैंने एक ही संदेश के साथ मावेन असेंबली प्लगइन की भी कोशिश की है।
संदर्भ के लिए pom फ़ाइल
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>Application</groupId>
<artifactId>Main</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>SpaceRunner</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-controls</artifactId>
<version>11</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<release>10</release>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.6.0</version>
<executions>
<execution>
<goals>
<goal>java</goal>
</goals>
</execution>
</executions>
<configuration>
<mainClass>Application.Main</mainClass>
</configuration>
</plugin>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>
Application.Main
</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.0</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>Application.Main</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>