java .jpackage_jpackage安装Java原生本机应用的新工具

长期以来,Java开发人员一直希望构建可以直接安装在本机平台上的应用程序,而不是分发jar和配置类路径。使用jpackage,可以按照特定平台的用户使用的方式安装/卸载Java应用程序,它支持Windows上的msi和exe格式,MacOS 上的pkg和dmg以及Linux上的deb和rpm。安装使用jpackage构建的应用程序时,最终用户不应注意到任何差异。

jpackage的输出是一个Java应用程序映像,包含所有必需的Java依赖项。映像存储在文件系统的单个目录中,可以包含以下内容:

本机应用程序启动器

Java运行时映像,包括模块化应用程序时的应用程序模块

应用程序资源,例如jar,ico,png

配置文件,例如plist,cfg,properties

jpackage工具计划在新的jdk.jpackage模块中成为JDK 13的一部分。

jpackage工具有两种模式:

create-image - 生成特定于平台的应用程序镜像

create-installer - 为应用程序生成特定于平台的安装程序

要生成模块化应用程序镜像:

jpackage create-image --output outputdir --name AppName \

--main-class package.ClassName -module moduleName -p modulePath

jpackage create-image --o outputdir -n AppName \

-c package.ClassName -m moduleName -p modulePath

要生成非模块化应用程序映像:

jpackage create-image --input inputdir --output outputdir \

--name AppName --main-class package.ClassName --main-jar MyJar.jar

jpackage create-image -i inputdir -o outputdir -n AppName \

-c package.ClassName -j MyJar.jar

要生成应用程序安装程序:

jpackage create-installer -i inputdir -o outputdir \

-n  -c package.ClassName -j MyJar.jar

jpackage create-installer -o outputdir -n \

--app-image

要生成Java运行时安装程序:

jpackage create-installer --runtime-installer\

--name  --output outputdir

jpackage create-installer --runtime-installer \

-n  -o outputdir --runtime-image

一些适用于所有平台的选项:

--main-jar -j - 应用程序的主要JAR; 包含主类

--main-class -c - 要执行的应用程序主类的限定名称

--installer-type - 在create-image模式下创建的安装程序的类型(msi,exe,rpm,deb,dmg,pkg,pkg-app-store)

--runtime-installer - 为Java运行时生成特定于平台的安装程序。

--jvm-args - 传递给虚拟机的Java参数

--install-dir - 应用程序安装目录的绝对路径

某些选项仅适用于Mac OS X平台:

--mac-sign - 请求对包进行签名

--mac-bundle-name - 菜单栏中显示的应用程序的名称

--mac-app-store-category - Mac App Store类别

--mac-signing-keychain - 要使用的钥匙串的路径

关于jpackage的其他有趣的事情包括:

支持打包Java应用程序,使其适合提交到Windows或MacOS应用程序商店

设置文件关联时的本机集成,以便在打开具有关联后缀的文件时启动应用程序

本机集成,可以启动特定于平台的菜单组,例如Windows上的“开始”菜单项

不支持交叉编译; 应该通过在Windows上运行jpackage来创建Windows程序包

将不支持超出JMOD文件中已提供的法律文件,例如单个许可证文件

不支持原生启动画面

不支持自动更新机制

该工具在Solaris平台上不可用

不支持Java Web Start应用程序和JavaFX特定功能

该工具没有GUI; 仅提供命令行界面(CLI)

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Android 原生 Framework 中,可以使用以下方式来判断是否具有 FOREGROUND_SERVICE 权限: 1. 在 PackageManagerService.java 中,可以找到 checkPermission() 方法,该方法用于检查应用程序是否具有指定的权限。在该方法中,可以查找 FOREGROUND_SERVICE 权限并返回相应的结果,代码如下: ``` private int checkPermission(String perm, int uid, int callingPid, int callingUid) { // ... if (perm.equals(Manifest.permission.FOREGROUND_SERVICE)) { if (mAppOpsService.noteOperation(AppOpsManager.OP_RUN_FOREGROUND, uid, packageName) == AppOpsManager.MODE_ALLOWED) { granted = PackageManager.PERMISSION_GRANTED; } } // ... return granted; } ``` 在该方法中,通过调用 AppOpsManager.noteOperation() 方法来检查应用程序是否具有 FOREGROUND_SERVICE 权限。如果应用程序具有该权限,则返回 PackageManager.PERMISSION_GRANTED;否则返回 PackageManager.PERMISSION_DENIED。 2. 在 ActivityManagerService.java 中,可以找到 checkForegroundServicePermission() 方法,该方法用于检查应用程序是否具有 FOREGROUND_SERVICE 权限以及是否可以启动前台服务。在该方法中,可以先检查应用程序是否具有 FOREGROUND_SERVICE 权限,如果有,则再检查应用程序是否可以启动前台服务,代码如下: ``` private int checkForegroundServicePermission(int uid, String packageName, int callingPid, int callingUid, int startId, boolean lastStartForeground) { // ... if (checkPermission(Manifest.permission.FOREGROUND_SERVICE, uid, callingPid, callingUid) != PackageManager.PERMISSION_GRANTED) { Slog.w(TAG, "startForegroundService not allowed due to lack of FOREGROUND_SERVICE permission"); return START_NOT_STICKY; } final long origId = Binder.clearCallingIdentity(); boolean fgServiceAllowed = false; try { fgServiceAllowed = mBatteryStatsService.noteStartForeground(packageName, uid, lastStartForeground); } catch (RemoteException e) { Slog.w(TAG, "Failed to note battery stats for startForegroundService", e); } finally { Binder.restoreCallingIdentity(origId); } if (!fgServiceAllowed) { Slog.w(TAG, "startForegroundService not allowed due to battery stats"); return START_NOT_STICKY; } // ... return START_SUCCESS; } ``` 在该方法中,首先调用 checkPermission() 方法来检查应用程序是否具有 FOREGROUND_SERVICE 权限。如果应用程序没有该权限,则返回 START_NOT_STICKY。如果应用程序具有该权限,则调用 BatteryStatsService.noteStartForeground() 方法来检查应用程序是否可以启动前台服务。如果可以,则返回 START_SUCCESS;否则返回 START_NOT_STICKY。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值