我的服务器运行 Java 应用程序,需要我用自己下载的 Java 库文件替换一些 Java 库文件。这与 JCE 安全扩展有关,与我的问题无关。
我发现当 apt 稍后更新我的 java 包时,这些库文件往往会被 apt 覆盖。
是否有一种适合 apt 的方法来屏蔽这些特定文件,以便 apt 不会触碰它们?
潜在解决方案
我正在考虑从文件中删除写入标志,但我预计当它稍后尝试覆盖它们时,这会导致 apt 将其内容喷得到处都是?
也许有一个我不知道的 java 自定义库目录,我可以将我的文件停放在那里,然后它们将被加载而不是包的默认值?
我正在考虑的最后一个选择是编写一个 cron 作业,定期用我的版本替换文件。我讨厌这个选择。
详细说明
我们正在运行一个相当繁重的 Java Web 应用程序(GeoServer 的定制版本)。该应用程序使用Java 加密扩展。
apt 安装的 JCE 版本是国际版本,但是,这个版本相对来说不太完善。还有另一个版本(我们必须使用)。这个版本只允许在某些地区安装。我们通过将默认的 JCE jar(在 中)替换/usr/lib/jvm/java-7-oracle/jre/lib/security
为我们所需的适当版本的 jar 来安装它。这个位置下的这两个特定 jar 文件会被 apt 定期替换,最终破坏我们的应用程序。反过来,我害怕运行软件更新。
答案1
我的“答案”最终是极其针对特定应用的。
简而言之
每次我的 Java Web 应用程序启动时,都会重新复制 JCE jar。
详细
我的 Java 应用程序通过 Jetty 运行。我使用自定义 upstart 作业来管理 jetty。我在 upstart 作业中添加了一个脚本节,该脚本节在启动 jetty 之前复制到 JCE jar 中。
在我的测试中,我发现如果我在应用程序运行时将 Java 安装改回默认 JCE,我的应用程序似乎完全不受影响。我认为这与 Linux 处理文件读取句柄的方式有关。即使在文件系统中替换了旧文件后,我仍然拥有旧文件的句柄,预先存在的句柄在关闭之前仍然有效。
我们将看看这是否会导致巨大的痛苦。不过我认为这不算太糟。这是我迄今为止发现的最糟糕的选择。如果做不到这一点,我们将不得不更改应用程序的源代码,使用在我看来非常自相矛盾的 Java 源代码解决方法。
答案2
不管怎样,如果你使用 CentOS,你也会遇到同样的问题。我刚刚在 RHEL 上遇到了同样的问题。我发现的一个解决方案是改用 OpenJDK,据说它附带了无限强度的 JCE:
这对我来说不是一个选择,但我还遇到了这种情况:
这表明使用指向 JCE jars备择方案命令。我采用了该方法并降级/升级了 Java 来测试它,看起来效果很好。我使用的实际命令如下: