电脑版的思维导图软件,我还是最钟爱 xmind,然而在 archlinux 下从 AUR 构建 xmind 直接启动之后报错。
问题描述
-
安装完之后,直接点击图标直接启动,弹出以下对话框。
-
在安装 XMind 时,输出的结果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30正在加载软件包...
正在解析依赖关系...
正在查找软件包冲突...
软件包 (1) xmind-3.7.8+8update8-1
全部安装大小: 125.02 MiB
:: 进行安装吗? [Y/n]
(1/1) 正在检查密钥环里的密钥 [###########################] 100%
(1/1) 正在检查软件包完整性 [###########################] 100%
(1/1) 正在加载软件包文件 [###########################] 100%
(1/1) 正在检查文件冲突 [###########################] 100%
(1/1) 正在检查可用存储空间 [###########################] 100%
:: 正在处理软件包的变化...
(1/1) 正在安装 xmind [###########################] 100%
If XMind crashed on start, trying delete ~/.xmind
If you want to change gtk version or java version, please edit PKGBUILD and rebuild the package. Or edit /usr/share/xmind/XMind/XMind.ini, change number to your gtk version after "--launcher.GTK_version", and add/delete "--add-modules=java.se.ee" at the end of file if you use java 10/8.
xmind 的可选依赖
gtk2: gtk2 or gtk3 must install one [已安装]
gtk3: gtk2 or gtk3 must install one [已安装]
lame: needed for the feature audio notes [已安装]
:: 正在运行事务后钩子函数...
(1/6) Arming ConditionNeedsUpdate...
(2/6) Updating fontconfig cache...
(3/6) Updating 32-bit fontconfig cache...
(4/6) Updating the desktop file MIME type cache...
(5/6) Updating the MIME type database...
(6/6) Updating X fontdir indices...
问题探究
常规思考
由打包者提示的信息,基本可以猜测,是 java 运行环境的问题,以及启动参数 --add-modules=java.se.ee 的问题。
那么尝试从命令行启动,看看有没有报错信息吧,先找到对应的命令
1 | pacman -Ql xmind | grep desktop |
得知启动命令是 XMind,那么直接执行 XMind 试试之后,得到如下报错,同时弹出上面那错误对话框。
1 | Unrecognized option: --add-modules=java.se.ee |
提示很明显,不识别的参数 --add-modules=java.se.ee,结合上面安装的时候给的信息,去编辑 /usr/share/xmind/XMind/XMind.ini,发现里面有 --add-modules=java.se.ee 这一行,把这一行删掉。
然后再输入 XMind ,发现启动成功!
深入探究
抱着追根究低的态度继续思考,–add-modules=java.se.ee 有什么意义呢为什么会被加上?再细细读打包者给出的信息的最后一句话
1 | and add/delete "--add-modules=java.se.ee" at the end of file if you use java 10/8. |
很容易猜出,java 10 可能支持 --add-modules=java.se.ee,而 java 8 不支持。
看看当前的系统中的 java 版本吧
1 | java -version |
果然是 1.8 版本。
那么我们装个 java 10 试试。
1 | sudo pacman -S java-runtime=10 |
然后用 java 切换脚本(详见 java的archwiki),切换成 java 10
1 | # 列出系统中所有 java 环境 |
然后再试试启动 XMind,发现启动不了了,如下弹窗报错
去看这个日志,发现一大堆,因为没学过太多 java,所以看不懂也并不想看。
直接把 --add-modules=java.se.ee 加回 /usr/share/xmind/XMind/XMind.ini 再试试启动,发现启动成功。
也就是验证了前面猜测是正确的:
- 在 java 8 的环境下,不能有 --add-modules=java.se.ee
- 在 java 10 的环境下,必须有 --add-modules=java.se.ee
修改 PKGBUILD 重新打包
我再打开这个包的 PKGBUILD 一看,发现有 JAVA_VERSION=10 语句,然后 package 函数里有 if [[ “$JAVA_VERSION” != “8” ]]; then 来决定是否往里写 --add-modules=java.se.ee
但是就算在这里改了 JAVA_VERSION 这个变量,那谁知道用户的机子里默认的是 java8 还是 java10 呢?这里 JAVA_VERSION 设置的是 10 ,而大多数用户默认肯定是 8,这么一来,岂不是对新手很不友好?
有没有更好的打包方案呢,有,我觉得可以这样做:
-
将依赖行为 depends=(‘java-runtime>=8’) 改成 depends=(“java-runtime=$JAVA_VERSION”)
-
将启动脚本里面加上一行对应的 PATH 变量来显式指定 java 环境。
即在最后一行 cp ${srcdir}/XMind ${pkgdir}/usr/bin/ 后面加
1
sed -i '/exec/iPATH=/usr/lib/jvm/java-'"$JAVA_VERSION"'-openjdk/bin:$PATH' ${pkgdir}/usr/bin/XMind
至此,观察到里面选择 gtk2 还是 gtk3 也是同样的道理。
最终给出我修改后完整的 PKGBUILD
1 | $Id: PKGBUILD 184754 2016-08-01 15:30:30Z felixonmars $ |
然后可以随意修改 GTK_VERSION 和 JAVA_VERSION 来达到目的,并且还不用额外修改任何东西,无论如何切换默认 java 版本,都不会再影响启动了。
重新打包测试,成功。