我在 Ubuntu MATE 18.04 上。我尝试的所有 jnlp 应用程序都出现执行错误。经过检查,Java 中似乎缺少一些库。
因此我删除了所有内容,重新开始安装,发现 apt-get install icedtea-8-plugin 依赖于:
ca-certificates-java default-jre default-jre-headless icedtea-8-plugin
icedtea-netx librhino-java libtagsoup-java openjdk-11-jre
openjdk-11-jre-headless
虽然预计它依赖于 openjdk-8,而不是 11(根据 ubuntu 软件包网站)。我怀疑 jdk-11 不包含所需的一些库。
我猜是我安装了一些 PPA,现在产生了这种情况,即 jdk-11 是比任何 jdk-8 包都更新的选择。那么,我如何才能实现 icedtea-8 与 openjdk-8 一起安装,而不是 11?
编辑:这是我尝试从 Firefox 启动 jnlp 应用程序时的输出:
Denying permission: ("java.lang.RuntimePermission" "accessClassInPackage.sun.util.resources")
net.sourceforge.jnlp.LaunchException: Fatal: Launch Error: Could not launch JNLP file. The application has not been initialized, for more information execute javaws/browser from the command line and send a bug report. at net.sourceforge.jnlp.Launcher.launchApplication(Launcher.java:582)
...
Running jdk9+ ?
java.lang.ClassNotFoundException: sun/misc/JarIndex
...
java.io.FileNotFoundException: /home/roman/.config/icedtea-web/deployment.properties (No existe el archivo o el directorio) at java.base/java.io.FileInputStream.open0(Native Method)
ClassNotFoundException:sun/misc/JarIndex 让我认为这是由于对 jdk11 的依赖造成的,因为这个类似乎已在 Java 9 中删除。
我尝试只安装 openjdk-8,然后从源代码构建 icedtea。然而,当我完成后,它没有被 Firefox 检测到(可能是缺少了某些命令)。
任何想法?
另外,找到下面这些命令的输出(根据您的答案尝试安装后):
roman@roman-desktop:~$ update-java-alternatives -l
java-1.11.0-openjdk-amd64 1111 /usr/lib/jvm/java-1.11.0-openjdk-amd64
java-1.8.0-openjdk-amd64 1081 /usr/lib/jvm/java-1.8.0-openjdk-amd64
roman@roman-desktop:~$ which javaws
/usr/bin/javaws
答案1
经过反复尝试,我发现只有一个有用的解决方案 - 我们需要使用以下命令从以前的 Ubuntu 16.04 LTS 手动安装普通的 OpenJDK 8。通常不推荐这样做,但我们没有其他具有积极结果的方法。
因此安装的命令如下(我们删除现有的 OpenJDK,然后手动安装 deb 包):
sudo apt purge oracle-java11-* -y
sudo apt purge *openjdk* -y
sudo apt autoremove --purge -y
wget http://archive.ubuntu.com/ubuntu/pool/main/o/openjdk-8/openjdk-8-jre-headless_8u272-b10-0ubuntu1~16.04_amd64.deb
sudo apt install -y ./openjdk-8-jre-headless_8u222-b10-1ubuntu1~16.04.1_amd64.deb
wget http://security.ubuntu.com/ubuntu/pool/main/libp/libpng/libpng12-0_1.2.54-1ubuntu1.1_amd64.deb
sudo apt install -y ./libpng12-0_1.2.54-1ubuntu1.1_amd64.deb
wget http://archive.ubuntu.com/ubuntu/pool/main/o/openjdk-8/openjdk-8-jre_8u272-b10-0ubuntu1~16.04_amd64.deb
sudo apt install -y ./openjdk-8-jre_8u222-b10-1ubuntu1~16.04.1_amd64.deb
wget http://archive.ubuntu.com/ubuntu/pool/universe/i/icedtea-web/icedtea-netx-common_1.6.2-3ubuntu1_all.deb
sudo apt install -y ./icedtea-netx-common_1.6.2-3ubuntu1_all.deb
wget http://archive.ubuntu.com/ubuntu/pool/universe/i/icedtea-web/icedtea-netx_1.6.2-3ubuntu1_amd64.deb
sudo apt install -y ./icedtea-netx_1.6.2-3ubuntu1_amd64.deb
我们还需要使用下面的单个长命令来固定/保留这些包的版本:
cat <<EOF | sudo tee /etc/apt/preferences.d/pin-java8
Package: icedtea-netx
Pin: version 1.6.2-3ubuntu1
Pin-Priority: 1337
Package: icedtea-netx-common
Pin: version 1.6.2-3ubuntu1
Pin-Priority: 1337
Package: openjdk-8-jre
Pin: version 8u272-b10-0ubuntu1~16.04
Pin-Priority: 1337
Package: openjdk-8-jre-headless
Pin: version 8u272-b10-0ubuntu1~16.04
Pin-Priority: 1337
EOF
然后应用程序将运行
javaws StartProRealTime.jnlp
注意:安装 Oracle Java 11 或 12 也无济于事。
答案2
在我的系统上,我发现javaws
仍在尝试使用 jre-11(不起作用),因为default-jre-headless
(的依赖项icedtea-netx
)创建了一个链接(未被修改update-java-alternatives
)。
$ javaws
selected jre: /usr/lib/jvm/default-java
我必须手动更改该符号以指向 jre-8 版本才能javaws
再次运行。
答案3
我可以设置默认的 java-8 或 java-11。
$ sudo update-java-alternatives --jre --set java-1.8.0-openjdk-amd64
$ sudo update-java-alternatives --jre-headless --set java-1.8.0-openjdk-amd64
$ sudo update-java-alternatives --set java-1.8.0-openjdk-amd64
update-alternatives: error: no alternatives for appletviewer
update-alternatives: error: no alternatives for mozilla-javaplugin.so
update-java-alternatives: jdk alternative does not exist: /usr/lib/jvm/java-8-openjdk-amd64/bin/appletviewer
update-java-alternatives: jdk alternative does not exist: /usr/lib/jvm/java-8-openjdk-amd64/bin/jconsole
update-java-alternatives: plugin alternative does not exist: /usr/lib/jvm/java-8-openjdk-amd64/jre/lib/amd64/IcedTeaPlugin.so
$ sudo update-java-alternatives --jre --set java-1.11.0-openjdk-amd64
$ sudo update-java-alternatives --jre-headless --set java-1.11.0-openjdk-amd64
$ sudo update-java-alternatives --set java-1.11.0-openjdk-amd64
update-alternatives: error: no alternatives for appletviewer
update-alternatives: error: no alternatives for mozilla-javaplugin.so
然后通过其中一个命令正确设置变量 JAVA_HOME
$ export JAVA_HOME=$(readlink -f /usr/bin/java | sed "s:bin/java::")
$ export JAVA_HOME=$(readlink -f /usr/bin/java | sed "s:jre/bin/java::")
$ echo $JAVA_HOME
值得检查变量值。
跑步时
$ javaws filename.jnpl
我收到了一些警告和回应,包括
netx: 无效的 jnlp 文件 /home/phobos/express.jnpl
express.jnpl 是来自https://www.ariscommunity.com/aris-express/download
相应的答复如下
$ javaws ~/express.jnpl
selected jre: /usr/lib/jvm/java-8-openjdk-amd64/jre/
(java:11196): dbind-WARNING **: 19:40:56.468: Couldn't register with accessibility bus: Did not receive a reply. Possible causes include: the remote application did not send a reply, the message bus security policy blocked the reply, the reply timeout expired, or the network connection was broken.
netx: Invalid jnlp file /home/phobos/express.jnpl
$ javaws ~/express.jnpl
selected jre: /usr/lib/jvm/java-11-openjdk-amd64/
WARNING: package javax.jnlp not in java.desktop
netx: Invalid jnlp file /home/phobos/express.jnpl
现在需要找出 jnpl 文件或我的配置出了什么问题。
已解决 - 我使用了错误的文件名。现在可以正常工作了。
$ javaws ~/express.jnlp
selected jre: /usr/lib/jvm/java-8-openjdk-amd64/jre/
selected jre: /usr/lib/jvm/java-8-openjdk-amd64/jre/
Codebase matches codebase manifest attribute, and application is signed. Continuing. See: http://docs.oracle.com/javase/7/docs/technotes/guides/jweb/security/no_redeploy.html for details.
Starting application [com.idsscheer.aris.expresslauncher.AExpressLauncher] ...
May 02, 2019 6:36:28 PM com.idsscheer.aris.common.ADebug println
INFO: [config] creating plugin.cfg from jar file
当前版本 8u212 运行正常。仍需使 JAVA_HOME 名称更改永久生效。
答案4
我发现旧的 Oracle 安装继续保留环境变量设置:
% env | grep oracle
JAVA_HOME=/usr/lib/jvm/java-8-oracle
J2REDIR=/usr/lib/jvm/java-8-oracle/jre
DERBY_HOME=/usr/lib/jvm/java-8-oracle/db
J2SDKDIR=/usr/lib/jvm/java-8-oracle
unset
那些制作的程序javaws
会选择非 Oracle JRE。