openpnp2.2 - 环境搭建 - 编译 + 调试 + 打包
文章目录
- openpnp2.2 - 环境搭建 - 编译 + 调试 + 打包
- 概述
- 笔记
- 前置任务
- 克隆代码库
- 切到最新的tag
- 清理干净
- 编译工程
- 关掉旧工程
- 打开已经克隆好的openpnp2.2工程
- 将IDEA的SDK配置为openjdk23
- 切换中英文UI
- 设置JAVA编译器
- 构建工程
- 跑测试用例
- 单步调试下断点
- 导出工程的JAR包
- 安装install4j
- 配置打包要用的到JRE
- 制作openpnp2.2需要的JRE包
- 打开install4j工程,检查选项
- 在file中加入.jar包
- 在launchers中,指定.jar包和主类
- 手工选择自己打好的JRE包
- 打包
- 运行安装好的openpnp, 看是否正常?
- 最好弄个完整的install4j安装版
- END
openpnp2.2 - 环境搭建 - 编译 + 调试 + 打包
概述
openpnp升级了,当前版本2.2.
以前不会打包,只能将需要的class和jar包都收集起来用,模拟IDEA的调试环境。
虽然弄的openpnp散装的打包能用,但是看着好低级,好土。
这次看了一下官方文档,现在代码编译环境和打包都比以前友好。
试了一下,编译打包都成功。
笔记
前置任务
如果环境不在了,按照以前的笔记 openpnp - 软件调试环境搭建 将基本环境搭好。
克隆代码库
git@github.com:openpnp/openpnp.git
迁出到本地 D:\3rd\openpnp_prj\openpnp-official\openpnp
切到最新的tag
当前tag是2.2,切过去,建立一个分支
清理干净
我前面做过试验了,如果还用这个目录做试验,要clean掉未归档的文件,将变动过的文件用revert恢复到2.2tag的原始状态。
编译工程
IDEA版本为 2023.2.4
关掉旧工程
打开IDEA, 如果当前有别的工程,先将工程关了。
打开已经克隆好的openpnp2.2工程
此工程已经切到了2.2的tag
如果项目在IDEA的列表中,直接点击就打开了。
如果怕弄错了,将最近的项目从IDEA开始界面移除
如果是新位置的项目,就直接用IDEA打开项目的文件夹就行,应该是当作maven项目打开了。
打开工程后,如果是第一次用IDEA打开刚克隆好的库,会分析依赖库啥的,等右下角提示消失。
将IDEA的SDK配置为openjdk23
我现在用的是 openjdk-23.0.2_windows-x64_bin.zip => D:\tools\java\openjdk-23.0.2_windows-x64_bin\jdk-23.0.2
如果已经有了openjdk23, 就选为当前SDK.
如果是第一次换SDK, 就点击"添加SDK", 指到从install4j处偷来备份解压的openjdk23的目录就行。
点击确定,退出设置框。
重新编译工程,跑测试用例,这时,就没有任何红色的警告了。
切换中英文UI
如果操作IDEA时,和找到的资料对不上,可以随时切换中英文(需要重启IDEA).
设置JAVA编译器
如果编译时找不到java.exe, 将SDK重新删掉,再加一遍SDK就好了(我用的是自动侦测到的SDK, 实际就是我指定的那个SDK)
不需要在win10环境变量中配置JAVA_HOME那3个全局环境变量。
构建工程
跑测试用例
应该是都能编译测试过。
如果看到红色警告,先不管,这是因为没有用官方指定的openjdk23的最新版本引起的。后面换了就好了。
单步调试下断点
在main函数和自己关心的底层实现函数代码行处下断点,再点击单步运行就可以了,等断点命中,就可以开始学习了。
导出工程的JAR包
导出JAR包前,需要保证工程全部编译通过,全部测试都跑通。
将依赖都加入输出
如果只是为了打包,现在就可以关掉IDEA了。
安装install4j
install4j需要的最小版本为10.0.5.
从网上能找到的install4j学习版本都是试用版,即使输入了正确的序列号,打好包的程序也会弹框(“试用版…”).
可以从官方下载最新的install4j-v10.0.9, 这时install4j 10.x的最后一个版本, 然后用注册机产生序列号,虽然还是试用版,但是不影响打包的步骤。
配置打包要用的到JRE
拿openpnp2.2来举例。
openpnp2.2需要openjdk23的最新版本。
下载地址 https://jdk.java.net/23/
下载之后为 openjdk-23.0.2_windows-x64_bin.zip
解压开,释放到 D:\tools\java\openjdk-23.0.2_windows-x64_bin
制作openpnp2.2需要的JRE包
如果不自己下载JDK包,自己做JRE包。
让install4j没找到IRE包之后,去下载去自动做JRE包,时间很长。如果要用install4j给不同的工程打包,时间浪费严重。
且install4j自己去找的openjdk并不是官方的版本,有时从远程下载的列表中并没有最新的JDK版本。
且网络通讯质量不受控,让install4j从远程下载指定版本可能会失败。
打开install4j-10.0.9
JDK路径选为 D:\tools\java\openjdk-23.0.2_windows-x64_bin\jdk-23.0.2,就是自己下载解压的那个目录
这里的参数都不用改,最后生成的IRE包会给出路径名称。
模块要编辑一下,选择全部模块。
然后等IRE包制作完,默认的生成路径在APPDATA目录下。
C:\Users\me\AppData\Local\install4j\v10\jres\windows-amd64-23.0.2.tar.gz
打开install4j工程,检查选项
openpnp2给出的打包工程,也许jia包名称和JRE包都和自己的环境不同。需要检查。
openpnp2的install4j工程文件位置 => D:\3rd\openpnp_prj\openpnp-official\openpnp\OpenPnP.install4j
在file中加入.jar包
保存工程后,新加入的文件就变成了相对路径(相对工程的路径)。
在launchers中,指定.jar包和主类
这步是指定启动的类, e.g. jar包中的main(), 否则打包后会找不到主类报错。
openpnp工程一直将jar包命名为openpnp-gui-0.0.1-alpha-SNAPSHOT.jar, 好奇怪。
编辑这个项,换成我们刚作好的openpnp-gui.jar.
手工选择自己打好的JRE包
我用的JDK是win64的,我也只打一种win64的包。
打包时,要选前面打好的JRE包,否则运行时缺依赖
选择我们已经打好的JRE包.
打包
只编译winx64版本。
编译中出了2个警告,是install4j的问题,不是打包有问题。
看到打包后的exe大小,有418MB. 依赖应该打全了。
打包成功了,去打包发布目录中看一下。
将打包好的程序安装过程试一下,成功的。
安装程序有评估版提示,这是因为没有授权,用的install4j试用版的缘故,不管。如果有需求,就买license(7000RMB).
默认安装后的路径为 C:\Program Files\openpnp
我这里为了做实验,装到了新目录 C:\Program Files\openpnp2
如果有旧版配置文件,自己先删除一下那个旧配置目录
运行安装好的openpnp, 看是否正常?
可以正常跑起来了,说明编译打包都成功。
最好弄个完整的install4j安装版
install4j弄的真黑,试用版打包出来的exe也有弹框。
将工具本身搞个neg窗口提醒用户买东西就行了。为啥要将做好的安装程序和安装好的程序加neg窗口?
这可是动了用户本身的东西啊,算不算侵犯用户隐私啊. 有点招人恨啊。
做学习版注册机的大神,应该不是经常用install4j的用户。否则他不可能留着那2个neg弹窗。技术流的大神注意不到这个。
现在网上好多学习版的注册机, 都是将注册码算法搞定,就完事了。其实有可能被作者骗了。
e.g. install4j, 不知道花钱的用户是有另外的正版软件下载链接;还是程序是一个,但是有暗桩。
假设程序是一个,那么注册机的作者就是被软件作者耍了。有可能注册码判断到了报错弹窗的后面,还有判断逻辑。或者到了做exe时,又有对注册码的详细判断。
这个程序没壳的,可以用IDA和IDEA的JarEditor插件相结合,调试修改所有的本地程序的反汇编和JAVA的类实现,且能回写。
如果有刚需,只要花时间弄清改在哪里改,不存在改不动的问题。
看了安装程序.exe和包装好的java启动.exe, 都是在winMain处简单的neg弹窗。但是具体jinstall4j实现在哪里加的这2句代码,如果有刚需确实可以找一下。
END
相关文章:

openpnp2.2 - 环境搭建 - 编译 + 调试 + 打包
文章目录 openpnp2.2 - 环境搭建 - 编译 调试 打包概述笔记前置任务克隆代码库切到最新的tag清理干净编译工程关掉旧工程打开已经克隆好的openpnp2.2工程将IDEA的SDK配置为openjdk23 切换中英文UI设置JAVA编译器 构建工程跑测试用例单步调试下断点导出工程的JAR包安装install…...

OpenCV:图像修复
目录 简述 1. 原理说明 1.1 Navier-Stokes方法(INPAINT_NS) 1.2 快速行进方法(INPAINT_TELEA) 2. 实现步骤 2.1 输入图像和掩膜(Mask) 2.2 调用cv2.inpaint()函数 2.3 完整代码示例 2.4 运行结果 …...
QT全局所有QSS样式实时切换
方法如下: void loadQss(int qssType) {QString name;if (qssType 1)name ":/qss/day.qss";elsename ":/qss/night.qss";QFile file(name);file.open(QFile::ReadOnly);QString qss;qss file.readAll();qApp->setStyleSheet(qss);file.…...

MySQL三大版本的演进
三大版本的演进 文章目录 三大版本的演进一:5.6版本(大跃进时期)1:支持只读事务2:innodb存储引擎增强2.1:缓冲池刷盘策略优化2.2:BufferPool缓冲池预热 3:新增Performance_Schema库监…...

利用 IMU 估计人体关节轴向和位置 —— 论文推导
Title: 利用 IMU 估计人体关节轴向和位置 —— “Joint axis and position estimation from inertial measurement data by exploiting kinematic constraints” —— 论文推导 文章目录 I. 论文回顾II. 铰接关节的约束1. 铰接关节约束的原理2. 铰接关节约束的梯度3. 铰接关节约…...

脚本一键生成管理下游k8s集群的kubeconfig
一、场景 1.1 需要管理下游k8s集群的场景。 1.2 不希望使用默认的cluster-admin权限的config. 二、脚本 **重点参数: 2.1 配置变量。 1、有单独namespace的权限和集群只读权限。 2、自签名的CA证书位置要正确。 2.2 如果配置错误,需要重新…...

数据库系统概念第六版记录 三
外码约束(Foreign Key Constraint) 外码(Foreign Key, FK)是关系数据库中的一个约束,它用于保证表之间的引用完整性。外码的值必须: 要么存在于被引用表的主键列中,要么为空(NULL&…...
YOLOv11-ultralytics-8.3.67部分代码阅读笔记-files.py
files.py ultralytics\utils\files.py 目录 files.py 1.所需的库和模块 2.class WorkingDirectory(contextlib.ContextDecorator): 3.def spaces_in_path(path): 4.def increment_path(path, exist_okFalse, sep"", mkdirFalse): 5.def file_age(path__fi…...

微信小程序案例1——制作猫眼电影底部标签导航栏
文章目录 一、项目步骤1 新建一个无AppID的movie项目2将准备好的底部标签导航图标拷贝到movie项目下面(将图标文件夹image放到项目文件夹里)3 打开App.json配置文件,在pages数组里添加4个页面路径:电影“pages/movie/movie”、影院“pages/cinema/cinema…...

【大数据技术】搭建完全分布式高可用大数据集群(Kafka)
搭建完全分布式高可用大数据集群(Kafka) kafka_2.13-3.9.0.tgz注:请在阅读本篇文章前,将以上资源下载下来。 写在前面 本文主要介绍搭建完全分布式高可用集群 Kafka 的详细步骤。 注意: 统一约定将软件安装包存放于虚拟机的/software目录下,软件安装至/opt目录下。 安…...
【服务器知识】如何在linux系统上搭建一个nfs
文章目录 NFS网络系统搭建**1. 准备工作****2. 服务器端配置****(1) 安装 NFS 服务****(2) 创建共享目录****(3) 配置共享规则****(4) 生效配置并启动服务****(5) 防火墙配置** **3. 客户端配置****(1) 安装 NFS 客户端工具****(2) 创建本地挂载点****(3) 挂载 NFS 共享目录***…...

图片画质增强:轻松提升画质
前言: 今天给大家推荐一款非常实用的图片画质增强软件,它无需联网即可使用,完全离线操作,这款软件基于先进的深度学习技术,能够对模糊图片进行强大的高清处理,效果令人惊艳。 图片画质增强:一…...

vscode快速接入deepseek 实践操作
背景说明 在deepseek快速火爆的情况下,也想自己体验一把。看看在vscode中集成进来,方便平时的脚本开发。对于年纪大的人还是非常方便的。 操作过程 安装continue 打开vscode进入扩展市场,搜索安装 安装完成就是上面的样子,会…...

mapbox进阶,添加绘图扩展插件,绘制圆形
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️MapboxDraw 绘图控件二、🍀添加绘图扩…...
Cursor 与多语言开发:全栈开发的利器
引言 全栈开发要求开发者跨越前端、后端、数据库甚至数据科学等多个技术领域,而不同技术栈往往需要切换工具和思维方式。Cursor 作为一款 AI 驱动的智能编程助手,凭借其对 20 编程语言 和主流框架的深度支持,正在成为全栈开发的“瑞士军刀”…...

2025 CCF BDCI|“基于TPU平台的OCR模型性能优化”一等奖作品
2024年12月,中国计算机学会在海南博鳌成功举办了第十二届CCF大数据与计算智能大赛(简称2024 CCF BDCI)。本届比赛的算能赛道吸引了1748名选手报名,经过激烈角逐,北京航空航天大学的“常务副SOTA”团队脱颖而出…...

FPGA的IP核接口引脚含义-快解
疑问 手册繁琐,怎样快速了解IP核各输入输出接口引脚的含义。 答疑 不慌不慌,手册确实比较详细但繁琐,如何快速知晓该部分信息,涛tao道长给你们说,简单得很,一般新入门的道友有所不知,往往后面…...

数据库高安全—审计追踪:传统审计统一审计
书接上文数据库高安全—角色权限:权限管理&权限检查,从权限管理和权限检查方面解读了高斯数据库的角色权限,本篇将从传统审计和统一审计两方面对高斯数据库的审计追踪技术进行解读。 4 审计追踪 4.1 传统审计 审计内容的记录方式通…...

机器学习 - 需要了解的条件概率、高斯分布、似然函数
似然函数是连接数据与参数的桥梁,通过“数据反推参数”的逆向思维,成为统计推断的核心工具。理解它的关键在于区分“参数固定时数据的概率”与“数据固定时参数的合理性”,这种视角转换是掌握现代统计学和机器学习的基础。 一、在学习似然函…...

Spring Boot Web 入门
目录 Spring Boot Web 是 Spring Boot 框架的一个重要模块,它简化了基于 Spring 的 Web 应用程序的开发过程。以下是一个 Spring Boot Web 项目的入门指南,涵盖了项目创建、代码编写、运行等关键步骤。 1. 项目创建 使用 Spring Initializr 使用 IDE …...

idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...

Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...
Java求职者面试指南:计算机基础与源码原理深度解析
Java求职者面试指南:计算机基础与源码原理深度解析 第一轮提问:基础概念问题 1. 请解释什么是进程和线程的区别? 面试官:进程是程序的一次执行过程,是系统进行资源分配和调度的基本单位;而线程是进程中的…...
NPOI Excel用OLE对象的形式插入文件附件以及插入图片
static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...

从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践
作者:吴岐诗,杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言:融合数据湖与数仓的创新之路 在数字金融时代,数据已成为金融机构的核心竞争力。杭银消费金…...
前端中slice和splic的区别
1. slice slice 用于从数组中提取一部分元素,返回一个新的数组。 特点: 不修改原数组:slice 不会改变原数组,而是返回一个新的数组。提取数组的部分:slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...

ZYNQ学习记录FPGA(一)ZYNQ简介
一、知识准备 1.一些术语,缩写和概念: 1)ZYNQ全称:ZYNQ7000 All Pgrammable SoC 2)SoC:system on chips(片上系统),对比集成电路的SoB(system on board) 3)ARM:处理器…...