I empacotar um aplicativo JavaFX usando Maven e OpenJDK 1.8 A parte relevante do meu pom.xml:
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>ui.Main</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
Agora importante este utilizado para o trabalho . Eu sei disso porque eu fiz especificamente um git commit, onde a embalagem finalmente funcionou. Depois de um dia ou assim e várias construções como este (eu não consigo descobrir o que mudou), já não posso lançar o frasco devido ao seguinte erro:
$ java -jar target/app.jar
Error: Could not find or load main class ui.Main Caused by:
java.lang.NoClassDefFoundError: javafx/application/Application
Quando eu ver o conteúdo do frasco, eu posso ver que todas as dependências são especificamente incluídos, exceto as classes JavaFX.
O que eu tentei:
- Construir o frasco com
javapackager
- Tinker ao redor com o maven-javafx-plugin
- Explicitamente adicionar JavaFX como dependência no meu pom.xml na esperança que a assembleia-plugin seria empacotá-lo para mim
Nenhum dos acima foi bem-sucedida. A única maneira que eu sou capaz de lançar meu aplicativo é diretamente do IDE, o que parece significar que as libs JavaFX estão ainda disponíveis em meu sistema.
Algumas ideias sobre como obter este para executar (mais uma vez)?
Resposta curta
Passei a jarra com openJDK 11, que não inclui o JavaFX, enquanto a construção com openJDK 8. Caso encerrado.
Constatações, detalhes e razões
Desde a minha IDE foi capaz de executar o meu código sem problemas, eu presumi que o problema é específico para a minha config / máquina. Como se vê Canonical / Ubuntu decidiu
[Para] Bionic [...] mover o padrão JRE / JDK no principal para OpenJDK 11 em setembro / outubro 2018 como uma SRU. AskUbuntu
E, como apontado em um segmento tão diferente:
JavaFX 11 não faz parte do JDK mais StackOverflow
(Isso também inclui instruções sobre como corrigir isso com JDK 11)
E, finalmente, como a lei de Murphy tinha, eu definir a minha embalagem do projeto em 4 de outubro, e decidiu instalar eclipse via apt em 8 de outubro, que inclui openjdk-11-jdk:amd64
(isto é registrada no útil /var/log/apt/history.log
).
Este também atualizei meu /etc/alternatives/java
apontar para v11. Desde que eu corri minha frasco sem especificar explicitamente o binário java, ele quebrou.
Corrida
/usr/lib/jvm/java-8-openjdk-amd64/bin/java -jar target/app.jar
Para um rápido teste funciona como esperado. Agora eu só preciso atualizar o meu projeto para openJDK 11 ou então sempre executar meu aplicativo com o específico JDK 8.