0

What did I do wrong? Trying to build native-image app following this graalvm guide.But I can't.

Maybe it lacks some linking inside project... I'm working in IntellijIDEA and it says, that I can't use where I use it. From net seraching I concluded, that it isn't important, but maybe there is my problem? Here is pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <profiles>
        <profile>
            <id>native</id>
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.codehaus.mojo</groupId>
                        <artifactId>exec-maven-plugin</artifactId>
                        <version>3.1.0</version>
                        <executions>
                            <execution>
                                <id>java-agent</id>
                                <goals>
                                    <goal>exec</goal>
                                </goals>
                                <configuration>
                                    <executable>java</executable>
                                    <workingDirectory>${project.build.directory}</workingDirectory>
                                    <arguments>
                                        <argument>-classpath</argument>
                                        <classpath/>
                                        <argument>${mainClass}</argument>
                                    </arguments>
                                </configuration>
                            </execution>
                            <execution>
                                <id>native</id>
                                <goals>
                                    <goal>exec</goal>
                                </goals>
                                <configuration>
                                    <executable>${project.build.directory}/${imageName}</executable>
                                    <workingDirectory>${project.build.directory}</workingDirectory>
                                </configuration>
                            </execution>
                        </executions>
                    </plugin>
                    <plugin>
                        <groupId>org.graalvm.buildtools</groupId>
                        <artifactId>native-maven-plugin</artifactId>
                        <version>${native.maven.plugin.version}</version>
                        <extensions>true</extensions>
                        <executions>
                            <execution>
                                <id>build-native</id>
                                <goals>
                                    <goal>build</goal>
                                </goals>
                                <phase>package</phase>
                            </execution>
                            <execution>
                                <id>test-native</id>
                                <goals>
                                    <goal>test</goal>
                                </goals>
                                <phase>test</phase>
                            </execution>
                        </executions>
                        <configuration>
                            <fallback>false</fallback>
                            <buildArgs>
                                <arg>-H:DashboardDump=fortune -H:+DashboardAll</arg>
                            </buildArgs>
                            <agent>
                                <enabled>true</enabled>
                                <options>
                                    <option>experimental-class-loader-support</option>
                                </options>
                            </agent>
                        </configuration>
                    </plugin>
                </plugins>
            </build>
        </profile>
    </profiles>

    <modelVersion>4.0.0</modelVersion>

    <groupId>adianov.sergei</groupId>
    <artifactId>COVID-Risk</artifactId>
    <version>1.0-SNAPSHOT</version>
    <name>COVID-Risk</name>

    <properties>
        <native.maven.plugin.version>0.9.18</native.maven.plugin.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <junit.version>5.8.2</junit.version>
        <maven.compiler.source>${java.specification.version}</maven.compiler.source>
        <maven.compiler.target>${java.specification.version}</maven.compiler.target>
        <imageName>COVID Risking</imageName>
        <mainClass>MainApp</mainClass>
    </properties>

    <dependencies>
        <!-- https://mvnrepository.com/artifact/org.codehaus.mojo/exec-maven-plugin -->
        <dependency>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>exec-maven-plugin</artifactId>
            <version>3.1.0</version>
        </dependency>

        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-controls</artifactId>
            <version>19-ea+7</version>
        </dependency>

        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-fxml</artifactId>
            <version>19-ea+7</version>
        </dependency>

        <dependency>
            <groupId>org.controlsfx</groupId>
            <artifactId>controlsfx</artifactId>
            <version>11.1.1</version>
        </dependency>

        <dependency>
            <groupId>com.dlsc.formsfx</groupId>
            <artifactId>formsfx-core</artifactId>
            <version>11.5.0</version>
            <exclusions>
                <exclusion>
                    <groupId>org.openjfx</groupId>
                    <artifactId>*</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <version>${junit.version}</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <version>${junit.version}</version>
            <scope>test</scope>
        </dependency>

    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>com.google.cloud.tools</groupId>
                <artifactId>jib-maven-plugin</artifactId>
                <version>3.1.4</version>
                <configuration>
                    <to>
                        <image>docker.io/heartofglass404/COVID_Risking</image>
                    </to>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.10.1</version>
                <configuration>
                    <source>19</source>
                    <target>19</target>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.openjfx</groupId>
                <artifactId>javafx-maven-plugin</artifactId>
                <version>0.0.8</version>
                <executions>
                    <execution>
                        <!-- Default configuration for running with: mvn clean javafx:run -->
                        <id>default-cli</id>
                        <configuration>
                            <mainClass>adianov.sergei.covidrisk/adianov.sergei.covidrisk.HelloApplication</mainClass>
                            <launcher>app</launcher>
                            <jlinkZipName>app</jlinkZipName>
                            <jlinkImageName>app</jlinkImageName>
                            <noManPages>true</noManPages>
                            <stripDebug>true</stripDebug>
                            <noHeaderFiles>true</noHeaderFiles>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

And error:

[ERROR] Command execution failed. org.apache.commons.exec.ExecuteException: Process exited with an error: 1 (Exit value: 1) at org.apache.commons.exec.DefaultExecutor.executeInternal (DefaultExecutor.java:404) at org.apache.commons.exec.DefaultExecutor.execute (DefaultExecutor.java:166) at org.codehaus.mojo.exec.ExecMojo.executeCommandLine (ExecMojo.java:1000) at org.codehaus.mojo.exec.ExecMojo.executeCommandLine (ExecMojo.java:947) at org.codehaus.mojo.exec.ExecMojo.execute (ExecMojo.java:471) at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo (DefaultBuildPluginManager.java:137) at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute2 (MojoExecutor.java:370) at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute (MojoExecutor.java:351) at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:215) at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:171) at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:163) at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:117) at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:81) at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build (SingleThreadedBuilder.java:56) at org.apache.maven.lifecycle.internal.LifecycleStarter.execute (LifecycleStarter.java:128) at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:294) at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:192) at org.apache.maven.DefaultMaven.execute (DefaultMaven.java:105) at org.apache.maven.cli.MavenCli.execute (MavenCli.java:960) at org.apache.maven.cli.MavenCli.doMain (MavenCli.java:293) at org.apache.maven.cli.MavenCli.main (MavenCli.java:196) at jdk.internal.reflect.DirectMethodHandleAccessor.invoke (DirectMethodHandleAccessor.java:104) at java.lang.reflect.Method.invoke (Method.java:578) at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.java:282) at org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:225) at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:406) at org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:347)

TDC_404
  • 3
  • 2
  • that error does not have the details for what error graalvm getting, can you share longer stacktrace or a reproducer would be easier to see the error. – ozkanpakdil Jan 17 '23 at 18:10
  • Here is full trace https://github.com/graalvm/native-build-tools/issues/385 – TDC_404 Jan 19 '23 at 14:00

1 Answers1

0

For building javaFX with graalVM I used gluonhq, looks like Gluon is the responsible of javaFX at here they say

Kudos go to the fine people at Gluon who took care of the bulk of the work on JavaFX 19. Do check their JavaFX Long Term Support services.

I tried to fix your reproducer first but it has so many maven plugin configured it was confusing and bulky so I created a clean pom xml from gluon start page then added your reproducer and required configuration. Here is the result.

Most important part is below

<plugin>
    <groupId>com.gluonhq</groupId>
    <artifactId>gluonfx-maven-plugin</artifactId>
    <version>${gluonfx.plugin.version}</version>
    <configuration>
        <target>${gluonfx.target}</target>
        <mainClass>${main.class}</mainClass>
        <attachList>
            <list>display</list>
            <list>lifecycle</list>
            <list>statusbar</list>
            <list>storage</list>
        </attachList>
        <bundlesList>
            <list>adianov.sergei.covidrisk</list>
        </bundlesList>
        <reflectionList>
            <list>adianov.sergei.covidrisk.RootLayoutController</list>
            <list>adianov.sergei.covidrisk.PersonOverviewController</list>
            <list>adianov.sergei.covidrisk.PersonEditDialogController</list>
            <list>javafx.scene.control.Button</list>
            <list>javafx.scene.control.CheckBox</list>
            <list>javafx.scene.control.CheckMenuItem</list>
            <list>javafx.scene.control.ChoiceBox</list>
            <list>javafx.scene.control.ColorPicker</list>
            <list>javafx.scene.control.ComboBox</list>
            <list>javafx.scene.control.Menu</list>
            <list>javafx.scene.control.MenuBar</list>
            <list>javafx.scene.control.MenuButton</list>
            <list>javafx.scene.control.MenuItem</list>
            <list>javafx.scene.control.RadioMenuItem</list>
            <list>javafx.scene.control.ScrollPane</list>
            <list>javafx.scene.control.Separator</list>
            <list>javafx.scene.control.SeparatorMenuItem</list>
            <list>javafx.scene.control.Slider</list>
            <list>javafx.scene.control.SplitPane</list>
            <list>javafx.scene.control.TableView</list>
            <list>javafx.scene.control.TableColumn</list>
            <list>javafx.scene.control.TextArea</list>
            <list>javafx.scene.control.TextField</list>
            <list>javafx.scene.control.ToggleButton</list>
            <list>javafx.scene.image.ImageView</list>
            <list>javafx.scene.layout.FlowPane</list>
            <list>javafx.scene.layout.GridPane</list>
            <list>javafx.scene.layout.HBox</list>
        </reflectionList>
    </configuration>
</plugin>

It was annoying to add those classes one by one, otherwise native image throws class not found exception.

I tried to use graalvm native maven plugin but for javafx we can not use that because javafx requires extra libraries which is covered by gluon plugin and one more thing I needed to use gluon graalvm

I used sdkman for gluon graalvm installation

sdk list java
sdk install java 22.1.0.1.r17-gln

I had one more problem related to compile was "not found libraries", to fix that I used

sudo apt install libasound2-dev libavcodec-dev libavformat-dev libavutil-dev libgl-dev libgtk-3-dev libpango1.0-dev libxtst-dev

found the apt command from here. To be honest my expectation from javaFX was higher. It is hard to compile and have a result with it, Swing looks easier even they say javaFX is strong. After all intellij still uses swing.

This is how it looks in my computer How look

ozkanpakdil
  • 3,199
  • 31
  • 48
  • 1
    Oh, that's a lot of work! Thank you for your efforts. So, after starting just from scratch and even NOT using native-image, just to build some runnable jar – stubled against jlink error, because I'm using apache poi and it has filename-based automodules that is not allowed to use with jlink. Maybe I'm just really overcomplify this application and it can be done much simplier... But, thanks again, you give me a few new thoughts on what's going on and how to fix it – TDC_404 Jan 20 '23 at 05:38