Come ottenere il JRE in bundle con launch4j?


Capisco che launch4j non raggruppa il JRE nel .exe ma che devi posizionarlo accanto ad esso. La mia domanda è, come dovrei farlo? C'è un modo per maven di individuare e copiare automaticamente il JRE del JDK che sto usando per creare la mia applicazione e copiarla in una determinata directory?

Ho provato a fare qualcosa del genere:

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

Ma il programma non si avvia. Mostra una piccola finestra di dialogo che scompare immediatamente (sembra essere vuota, ma va via troppo in fretta per me per notarlo davvero).

Author: pupeno, 2018-04-04

2 answers

AGGIORNAMENTO: cancellato la mia risposta precedente e sostituito con l'esempio di lavoro testato

AGGIORNAMENTO 2: Questo pom.xml ora scarica JRE tgz e lo decomprime e launch4j exe lo usa e funziona. Ho aggiunto commenti per spiegare come funziona.

Consiglierei di attaccare con solo un 32 bit exe e JRE. L'unico motivo per utilizzare il JRE a 64 bit sarebbe se il tuo programma dovesse utilizzare più di 4 GB di RAM.

Ovviamente ora hai bisogno di un programma di installazione che prenda tutto questo e si installi su File di programma. Ho usato NSIS per questo in passato. C'è una curva di apprendimento per NSIS ma non è male.

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

UPDATE 3: Il fatto triste è che non esiste un repository maven ufficiale o addirittura aggiornato con i JRE che si desidera. Potresti ospitare il tuo repository maven che ha i JRE desiderati. Si dovrà aggiornare questo come nuove versioni sono fatte. È anche una buona idea testare con la nuova versione prima di rilasciarla. Il terzo martedì di ogni mese è quando nuovi rilasci Java sono finiti. È possibile impostare un promemoria per questo per verificare se una nuova versione è stata rilasciata e scaricarla. Automatizzare questo è un dolore a causa del controllo del contratto di licenza. Questo post potrebbe aiutare, ma probabilmente non è possibile scaricare il tar.versione gz del JRE in questo modo: Java controlla l'ultima versione a livello di codice

Se vuoi supportare più piattaforme, ospitare il tuo repository maven è un buon modo per andare. Puoi ospitare il tuo repository e aggiornarlo con il nuovo JRE tar.gz ogni volta un il rilascio è fatto con questo: https://stackoverflow.com/a/29261502/35264

L'opzione più semplice è fare ciò a cui miravi già e usare semplicemente il JRE con cui stai costruendo. Questo ti permetterà di supportare Windows 32 e 64 finché costruisci con il JRE a 32 bit. È possibile aggiornare questo di tanto in tanto come si ha il tempo di testare con la nuova versione. Ecco un pom funzionante.xml che fa questo:

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

Credo che questo sia quello che stai cercando:

<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 consente di accedere al percorso JRE utilizzando la proprietà di sistema java.home. E puoi accedere alle proprietà del sistema java all'interno di pom . E hai un plugin che avvolge launch4j. Metti tutti questi insieme e hai la soluzione.

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