JavaFX embalagem: NoClassDefFoundError

tannerli:

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)?

tannerli:

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/javaapontar 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.

Acho que você gosta

Origin http://43.154.161.224:23101/article/api/json?id=181340&siteId=1
Recomendado
Clasificación