当前位置: 首页 > 面试题库 >

使用GNU / Linux中的maven为Mac用户捆绑Java程序

桓深
2023-03-14
问题内容

我正在尝试为Mac用户捆绑一个Java程序。我首先发现这篇文章解释了如何使用Ant进行操作,然后发现这对Maven来说似乎是完美的。

所以我加了pom:

<plugin>
    <groupId>sh.tak.appbundler</groupId>
    <artifactId>appbundle-maven-plugin</artifactId>
    <version>1.1.0</version>
    <configuration>
        <mainClass>xxx</mainClass>
        <iconFile>xxx</iconFile>
        <jrePath>???</jrePath>
    </configuration>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>bundle</goal>
            </goals>
        </execution>
    </executions>
</plugin>

(我也发现这篇文章解释了有关Mac捆绑软件以及为何使用appbundler的一些详细信息)

唯一的问题是,在发现的每个示例中,我都看到了<jrePath>xxx.jdk</jrePath>。但是我在Ubuntu下运行它,所以我只有GNU /
Linux jdk。在哪里可以找到Mac
jdk?在oracle网站上,我只能找到dmg文件。我提取了dmg并得到了hfs。我安装了hfs并获得了pkg。我提取了pkg,现在有更多文件,我不知道该怎么办…


问题答案:

以下是我在上的测试项目中所做的逐步操作Ubuntu 16.04.1 LTS

在您的情况下,步骤1至3将在GNU / Linux环境中完成,而最后一个将在Mac OS X中完成。

1.下载 JRE

由于您只需要JRE,所以最简单的方法是:

  1. 要转到下载区域,
  2. 点击JRE DOWNLOAD
  3. 选择tar.gz的版本JREMac OS X这是目前jre-8u112-macosx-x64.tar.gz
  4. 将存档内容解压缩到您将选择的文件夹中${jre-folder}(例如/foo/bar/jre1.8.0_112.jre)。

2.创建我的测试项目

我典型的Maven项目结构:

测试项目
└──src
| └──主要
| └──java
| └──我的
| └──pkg
| └──MyClass.java
└──pom.xml

我的班级my.pkg.MyClass实际上执行任意任务。在这里,它只是将系统属性转储到一个临时文件中,以便能够轻松地检查它是否已被调用:

package my.pkg;

import java.io.BufferedWriter;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;

public class MyClass {
    public static void main(String[] args) throws IOException {
        Path path = Files.createTempFile("MyClass", "txt");
        try (BufferedWriter writer = Files.newBufferedWriter(path)) {
            System.getProperties()
                .entrySet()
                .stream()
                .forEach(
                    entry -> {
                        try {
                            writer.write(entry.getKey() + "=" + entry.getValue() + "\n");
                        } catch (IOException e) {
                            throw new IllegalStateException(e);
                        }
                    }
                );
        }
    }
}

我的pom档案:

<?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>TestProject</groupId>
    <artifactId>TestProject</artifactId>
    <version>0.1-SNAPSHOT</version>
    <packaging>jar</packaging>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>sh.tak.appbundler</groupId>
                <artifactId>appbundle-maven-plugin</artifactId>
                <version>1.1.0</version>
                <configuration>
                    <mainClass>my.pkg.MyClass</mainClass>
                    <!--
                       For example
                    <jrePath>/foo/bar/jre1.8.0_112.jre</jrePath>
                    -->
                    <jrePath>${jre-folder}</jrePath>
                    <generateDiskImageFile>true</generateDiskImageFile>
                </configuration>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>bundle</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

3.建立我的测试项目

只需mvn package appbundle:bundle从目录的根目录启动命令TestProject

这将在 包含 for 的文件夹中构建 dmg文件 ,在这种情况下,它将称为。target JRE``Mac OS XTestProject-0.1-SNAPSHOT.dmg

4.测试我的测试项目

在目标上Mac OS X

  1. 双击 dmg文件 ,它将自动挂载映像,
  2. 然后您将可以双击TestProject.app,您会看到一个图标出现,并由于测试程序很短而迅速消失。
  3. 您可以通过cat $TMPDIR/MyClass*从终端启动来检查它是否正常工作,然后您将看到由测试应用程序创建的临时文件的内容。

5.将资源添加到dmg文件

将资源添加到生成的 dmg文件 ,你可以使用additionalResources一个fileSet

<plugin>
    <groupId>sh.tak.appbundler</groupId>
    <artifactId>appbundle-maven-plugin</artifactId>
    <version>1.1.0</version>
    <configuration>
        ...
        <additionalResources>
            <fileSet>
                <directory>/path/to/my/resources/folder</directory>
                <includes>
                    <include>*.pdf</include>
                </includes>
            </fileSet>
        </additionalResources>
    </configuration>
    ...
</plugin>

此示例将把所有pdf文件添加/path/to/my/resources/folder到生成的 dmg文件中

6.将资源添加到应用文件

将资源添加到生成的 应用程序文件 ,你可以使用additionalResources一个fileSet

<plugin>
    <groupId>sh.tak.appbundler</groupId>
    <artifactId>appbundle-maven-plugin</artifactId>
    <version>1.1.0</version>
    <configuration>
        ...
        <additionalBundledClasspathResources>
            <fileSet>
                <directory>/path/to/my/resources/folder</directory>
                <includes>
                    <include>*.pdf</include>
                </includes>
            </fileSet>
        </additionalBundledClasspathResources>
    </configuration>
    ...
</plugin>

这个例子将添加所有pdf从文件/path/to/my/resources/folder到生成的 应用程序文件
/Contents/Java/lib,他们将被自动纳入到应用程序的类路径,这样你就可以方便地访问它们。



 类似资料:
  • null 支持与平台无关的应用程序图标 支持对JAR的自动更新 运行my.jar时对JRE参数的支持 Linux支持(.deb或.rpm)

  • 这让我很惊讶,因为如果我没有安装Java的话,我怎么能开发Android应用呢?!实际上,Android Studio附带了捆绑的JDK/JRE(位于),但是系统没有找到它:executive给出 将设置为没有帮助--不喜欢它是一个目录。 问:我不想安装新的JDK,如果我已经有一个在Android Studio。如何将其设置为系统默认值?

  • 我正在将我的spring-java项目转移到OSGi。 我有一些依赖项,这些依赖项在spring ebr repo或maven repo中不能作为包提供。处理它们的最佳方法是什么? null

  • 本文向大家介绍GNU/Linux 基本的Linux实用程序,包括了GNU/Linux 基本的Linux实用程序的使用技巧和注意事项,需要的朋友参考一下 例子 Linux几乎可以执行所有任务的命令,并且其中大多数都是直观且易于解释的。 在Linux中获得帮助 命令 易用性 man <name> 阅读<名称>的手册页。 man <section> <name> 阅读与给定部分相关的<name>手册页。

  • 在感觉自己已经掌握了如何使用OSGi之后,我尝试向我的应用程序添加第三方依赖,特别是log4j2,该应用程序使用ApacheFelix并与maven捆绑插件捆绑。不幸的是,我似乎陷入了依赖地狱。 我尝试过使用许多maven捆绑包策略,如导入包,嵌入依赖,wrapImportPackage,Embed-Transitive,以及设置特定的版本号,仅举几例。以下是我的pom在这个插件中的样子: 我觉得