Comment obtenir le JRE à regrouper avec launch4j?


Je comprends que launch4j ne regroupe pas le JRE dans le .exe mais que vous devez le placer à côté de lui. Ma question est, comment suis-je censé faire? Existe-t-il un moyen pour maven de localiser et de copier automatiquement le JRE du JDK que j'utilise pour construire mon application et la copier dans un répertoire donné?

J'ai essayé de faire quelque chose comme ceci:

    <plugin>
        <artifactId>maven-resources-plugin</artifactId>
        <version>2.6</version>
        <executions>
            <execution>
                <id>copy-resources</id>
                <!-- here the phase you need -->
                <phase>package</phase>
                <goals>
                    <goal>copy-resources</goal>
                </goals>
                <configuration>
                    <outputDirectory>${basedir}/target/windows/jre</outputDirectory>
                    <resources>
                        <resource>
                            <directory>${java.home}</directory>
                        </resource>
                    </resources>
                </configuration>
            </execution>
        </executions>
    </plugin>

Mais le programme ne démarre pas. Il montre un petit dialogue qui disparaît immédiatement (il semble être vide, mais il disparaît trop vite pour que je le remarque vraiment).

Author: pupeno, 2018-04-04

2 answers

MISE À JOUR: Supprimé ma réponse précédente et remplacé par un exemple de travail testé

MISE À JOUR 2: Ce pom.xml télécharge maintenant le tgz JRE et le décompresse et l'exe launch4j l'utilise et cela fonctionne. J'ai ajouté des commentaires pour expliquer comment cela fonctionne.

Je recommanderais de rester avec juste un exe et JRE 32 bits. La seule raison d'utiliser le JRE 64 bits serait si votre programme doit utiliser plus de 4 Go de RAM.

Bien sûr, vous avez maintenant besoin d'un installateur qui prend tout cela et installe à Les Fichiers De Programme. J'ai utilisé NSIS pour cela dans le passé. Il y a une courbe d'apprentissage pour les INS, mais ce n'est pas trop mal.

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.akathist.encc</groupId>
    <artifactId>mavenproject1</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>
    <dependencies>
        <!-- This is the win32 JRE tgz hosted by alfresco - https://mvnrepository.com/artifact/com.oracle.java/jre -->
        <dependency>
            <groupId>com.oracle.java</groupId>
            <artifactId>jre</artifactId>
            <classifier>win32</classifier>
            <type>tgz</type>
            <version>1.8.0_131</version>
        </dependency>
    </dependencies>
    <repositories>
        <repository>
            <!-- this repository has the JRE tgz -->
            <id>alfresco</id>
            <url>https://artifacts.alfresco.com/nexus/content/repositories/public/</url>
        </repository>
    </repositories>
    <build>
        <plugins>
            <plugin>
                <!-- this is to extract the JRE tgz file we downloaded -->
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <version>2.5.1</version>
                <executions>
                    <execution>
                        <phase>generate-resources</phase>
                        <goals>
                            <goal>unpack-dependencies</goal>
                        </goals>
                        <configuration>
                            <includeGroupIds>com.oracle.java</includeGroupIds>
                            <includeTypes>tgz</includeTypes>
                            <includeArtifactIds>jre</includeArtifactIds>
                            <includeClassifiers>win32</includeClassifiers>
                            <outputDirectory>target/win32</outputDirectory>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <!-- This calls launch4j to create the program EXE -->
                <groupId>com.akathist.maven.plugins.launch4j</groupId>
                <artifactId>launch4j-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <id>l4j-clui</id>
                        <phase>package</phase>
                        <goals>
                            <goal>launch4j</goal>
                        </goals>
                        <configuration>
                            <headerType>console</headerType>
                            <outfile>target/encc.exe</outfile>
                            <jar>target/mavenproject1-1.0-SNAPSHOT.jar</jar>
                            <errTitle>encc</errTitle>
                            <classPath>
                                <mainClass>com.akathist.encc.Clui</mainClass>
                                <addDependencies>false</addDependencies>
                                <preCp>anything</preCp>
                            </classPath>
                            <jre>
                                <path>./win32/java</path>
                            </jre>
                            <versionInfo>
                                <fileVersion>1.2.3.4</fileVersion>
                                <txtFileVersion>txt file version?</txtFileVersion>
                                <fileDescription>a description</fileDescription>
                                <copyright>my copyright</copyright>
                                <productVersion>4.3.2.1</productVersion>
                                <txtProductVersion>txt product version</txtProductVersion>
                                <productName>E-N-C-C</productName>
                                <internalName>ccne</internalName>
                                <originalFilename>original.exe</originalFilename>
                            </versionInfo>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

MISE À JOUR 3: Le triste fait est qu'il n'existe pas de repo maven officiel ou même à jour avec le JREs que vous voulez. Vous pouvez héberger votre propre repo maven qui a le JREs souhaité. Vous devez mettre à jour que les nouvelles versions sont fait. C'est également une bonne idée de tester avec la nouvelle version avant de la publier avec. Le troisième mardi de chaque mois est lorsque de nouvelles versions Java sont fait. Vous pouvez définir un rappel pour vérifier si une nouvelle version a été publiée et la télécharger. L'automatisation est une douleur en raison de la vérification du contrat de licence. Cet article pourrait vous aider, mais vous ne pouvez probablement pas télécharger le tar.version gz du JRE de cette façon: Java vérifie la dernière version par programme

Si vous souhaitez prendre en charge plusieurs plates-formes, l'hébergement de votre propre repo maven est un bon moyen de procéder. Vous pouvez héberger votre propre dépôt et le mettre à jour avec le nouveau JRE tar.gz chaque fois un la libération se fait avec ceci: https://stackoverflow.com/a/29261502/35264

L'option la plus simple est de faire ce que vous visiez déjà et d'utiliser simplement le JRE avec lequel vous construisez. Cela vous permettra de prendre en charge Windows 32 et 64 tant que vous construisez avec le JRE 32 bits. Vous pouvez le mettre à jour occasionnellement car vous avez le temps de tester avec la nouvelle version. Voici un pom de travail.xml qui fait ceci:

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.akathist.encc</groupId>
    <artifactId>mavenproject1</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>
    <build>
        <plugins>
            <plugin>
                <!-- This copies the JRE used to do the build from java.home - should be 32 bit Windows JRE -->
                <artifactId>maven-resources-plugin</artifactId>
                <version>2.6</version>
                <executions>
                    <execution>
                        <id>copy-resources</id>
                        <!-- here the phase you need -->
                        <phase>package</phase>
                        <goals>
                            <goal>copy-resources</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>${basedir}/target/win32/java</outputDirectory>
                            <resources>
                                <resource>
                                    <directory>${java.home}</directory>
                                </resource>
                            </resources>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <!-- This calls launch4j to create the program EXE -->
                <groupId>com.akathist.maven.plugins.launch4j</groupId>
                <artifactId>launch4j-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <id>l4j-clui</id>
                        <phase>package</phase>
                        <goals>
                            <goal>launch4j</goal>
                        </goals>
                        <configuration>
                            <headerType>console</headerType>
                            <outfile>target/encc.exe</outfile>
                            <jar>target/mavenproject1-1.0-SNAPSHOT.jar</jar>
                            <errTitle>encc</errTitle>
                            <classPath>
                                <mainClass>com.akathist.encc.Clui</mainClass>
                                <addDependencies>false</addDependencies>
                                <preCp>anything</preCp>
                            </classPath>
                            <jre>
                                <path>./win32/java</path>
                            </jre>
                            <versionInfo>
                                <fileVersion>1.2.3.4</fileVersion>
                                <txtFileVersion>txt file version?</txtFileVersion>
                                <fileDescription>a description</fileDescription>
                                <copyright>my copyright</copyright>
                                <productVersion>4.3.2.1</productVersion>
                                <txtProductVersion>txt product version</txtProductVersion>
                                <productName>E-N-C-C</productName>
                                <internalName>ccne</internalName>
                                <originalFilename>original.exe</originalFilename>
                            </versionInfo>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>
 10
Author: Sarel Botha, 2018-04-08 20:35:54

Je crois que c'est ce que vous cherchez:

<plugin>
  <groupId>com.akathist.maven.plugins.launch4j</groupId>
  <artifactId>launch4j-maven-plugin</artifactId>
  <executions>
    <execution>
      ...
      <configuration>
        ...
        <jre>
          <path>${java.home}</path> <!-- SEE THIS -->
        </jre>
        ...
      </configuration>
    </execution>
  </executions>
</plugin>

Java vous permet d'accéder au chemin JRE en utilisant la propriété système java.home. Et vous pouvez accéder aux propriétés du système java dans pom . Et vous avez un plugin qui encapsule launch4j. Mettez tout cela ensemble et vous avez la solution.

 -1
Author: James, 2018-04-13 08:02:46