Когда вы добавляете три классификатора для javafx-graphics
, это решает проблему создания толстой кроссплатформенной фляги.
Однако, запуск вашего pom на Mac из терминала (это не IntelliJпроблема), происходит сбой, с опубликованной ошибкой (No toolkit found
).
Если вы запустите: mvn clean -X javafx:run
, вы найдете причину этого исключения:
[DEBUG] Executing command line: [.../Contents/Home/bin/java, \
--module-path, .../target/classes:\
.../.m2/repository/org/openjfx/javafx-base/13/javafx-base-13-mac.jar:\
.../.m2/repository/org/openjfx/javafx-controls/13/javafx-controls-13-mac.jar:\
.../.m2/repository/org/openjfx/javafx-fxml/13/javafx-fxml-13-mac.jar:\
.../.m2/repository/org/openjfx/javafx-graphics/13/javafx-graphics-13-linux.jar:\
.../.m2/repository/org/openjfx/javafx-graphics/13/javafx-graphics-13-mac.jar:\
.../.m2/repository/org/openjfx/javafx-graphics/13/javafx-graphics-13-win.jar,\
--add-modules,...]
Обратите внимание, чтоВо-первых, он показывает классификатор linux
, потому что артефакты отсортированы буквенно-цифровым образом, и три файла фактически ссылаются на один и тот же модуль javafx-graphics
.
Поскольку --module-path
разрешит только первое вхождение данного модуля (см. JEP 261 или этот ответ ), игнорируя остальные, mvn clean javafx:run
будет работать только в Linux.
В заключение, с вашей текущей помпой, толстый кроссплатформенный jar будет работать на Linux, Mac и Windows, а javafx:run
будет работать только на Linux.
Solution
Чтобы избежать необходимости комментировать графическую зависимость при помощи классификаторов каждый раз, когда вы хотите запустить javafx:run
, при этом оставляя их для построения плагина затенения, решение, основанное на этот ответ , это следующее:
- Удалите три зависимости
javafx-graphic
из вашего пом - Добавьте следующий профиль в ваш пом, включая эти три зависимости:
<profiles>
<profile>
<id>shadeProfile</id>
<dependencies>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-graphics</artifactId>
<version>13</version>
<classifier>win</classifier>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-graphics</artifactId>
<version>13</version>
<classifier>mac</classifier>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-graphics</artifactId>
<version>13</version>
<classifier>linux</classifier>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.app.MainClass</mainClass>
</transformer>
</transformers>
<shadedClassifierName>shaded</shadedClassifierName>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
Чтобы запустить этот профиль, вам нужно будет выполнить:
mvn -PshadeProfile package
Это будет включать все существующие зависимости в вашем pom, и дополнительно будет включать дополнительные три банки.
Теперь оба mvn clean javafx:run
и java -jar yourShade.jar
шможет работать на Linux, Mac и Windows.