Java SxS(并排)配置
Posted
技术标签:
【中文标题】Java SxS(并排)配置【英文标题】:Java SxS (side by side) configuration 【发布时间】:2013-09-16 08:12:17 【问题描述】:当我尝试在 Windows 中并排 (SxS) 中运行 Java 应用程序时,我遇到了一个非常模糊的问题。
我已经完成了创建 java.exe.config 和 java.exe.manifest 文件的所有准备工作,这些文件与 JRE 位于同一文件夹中。
当我从命令行调用应用程序时(通过启动 .bat 文件),应用程序运行正常。 .bat 文件使用 SxS 配置的 Java(这是我正在运行的应用程序框中唯一的一个)
但是,当我尝试从另一个 Java 进程(使用Runtime.getRuntime.exec()
)或ProcessBuilder
中调用它时,它似乎完全忽略了 SxS 配置,并且子 Java 进程抱怨它找不到 COM 库,这是我不得不做 SxS 的原因。我必须补充一点,父 Java 进程也是由为 SxS 配置的 Java.exe 启动的。因此,我假设“Runtime.getRuntime(), ProcessBuilder()
”将为我提供 Java SxS 加载环境。
使用一些 Windows 工具(procexp.exe、procmon.exe)进行进一步调试,我发现以下内容:当我从 .bat 文件启动应用程序时,crss.exe 通常会读取 .manifest 文件(因为它应该是)。但是,当 Java 生成另一个进程时,根本不会考虑 .manifest 文件。我能想到的一个可能的问题是启动进程的 Java.exe 的当前目录与 java.exe.manifest 文件所在的目录不同。
我唯一能想到的是 java 启动器中的一个错误/问题(或者他们称之为功能)。
有人遇到过类似的问题吗?任何人都可以阐明上述内容吗?非常感谢。
到目前为止,我已经尝试了以下方法:
从 .bat 文件中运行 java 进程。 工作 使用Runtime.getRuntime().exec(). <b>DID NOT WORK</b>
从父 Java 进程调用 java 进程
使用 Runtime.getRuntime().exec() 从父 Java 进程调用 .bat 文件。 没有工作
使用 ProcessBuilder 设置 .manifest 文件所在的当前目录。 没有工作
【问题讨论】:
我们在尝试通过需要 sxs 程序集的 JNI 加载本机 dll 时遇到了类似的问题。我们最终从资源中读取清单并在 C++ 代码中手动创建激活上下文。不确定是否有更好的方法。尝试以某种方式通过 ShellExecute 调用子进程? 这里不知道,但java
命令的描述似乎值得一读docs.oracle.com/javase/7/docs/technotes/tools/windows/java.html
@clwhisk 问题不在 java 命令中。问题在于 Windows 操作系统如何加载 java 命令。 java进程的父目录(当windows调用它时)似乎是C:\Windows,因此csrss.exe找不到SxS配置的java.exe.manifest文件。
【参考方案1】:
我在我的电脑上测试了它,它可以工作。试试:
从 Runtime.getRuntime().exec(...) 中读取 getErrorStream();并发送到这里,如果你不能解决这个问题, 使用完整路径 (C:\Program...) 运行进程, 将java程序编译成.jar,放入.bat文件夹,打开CMD,设置当前目录为该文件夹,运行jar文件(使用java -jar filename.jar),【讨论】:
以上是关于Java SxS(并排)配置的主要内容,如果未能解决你的问题,请参考以下文章