防止 jar 来自网络驱动器上的 运行
Prevent jar from running on network drive
一个可执行 jar 分发给每个网络驱动器的用户。我想阻止用户直接在网络上 运行 它,因为它会导致性能和其他问题。
一种解决方案是检查执行路径并将其与网络驱动器路径进行比较,但是如果事先不知道网络驱动器路径怎么办?还有其他可能吗?
我不认为你可以在纯粹的 Java 中做到这一点。我很确定您需要 运行 外部命令或调用本机代码来检测 JAR 文件是否在网络共享上。
您需要做的第一部分是获取 JAR 文件的绝对路径:
Class mainClass = MyMainClass.class;
File jarFile = new File(mainClass.getProtectionDomain()
.getCodeSource()
.getLocation()
.toURI());
我在 github 上找到了 Aaron Digulla 写的 "gist",它完成了任务的第二部分:
Aaron的代码采用Windows绝对路径,提取盘符然后运行s Windows net use <drive-letter>:
命令测试该驱动器是否为共享驱动器.
另一种方法是实现批处理文件执行以下操作的逻辑:
- 提取 JAR 文件的驱动器名称
- 使用
net use ...
测试共享驱动器
- 使用相同的技术检查 Java 安装是否也不在共享驱动器上1.
- 使用
java
命令启动应用程序
最后,拒绝 运行 共享驱动器可能不是一个好主意。用户可能有这样做的原因,而您并不知道。我建议提示用户并让用户选择继续。或者类似的东西。
或者,在应用程序的安装说明中记录 不建议 在共享驱动器(或等效驱动器)上安装 JRE / JDK 和应用程序。
1 - Java 安装在共享驱动器上的性能与共享驱动器上的应用程序 JAR 一样差,甚至更差。
一个可执行 jar 分发给每个网络驱动器的用户。我想阻止用户直接在网络上 运行 它,因为它会导致性能和其他问题。
一种解决方案是检查执行路径并将其与网络驱动器路径进行比较,但是如果事先不知道网络驱动器路径怎么办?还有其他可能吗?
我不认为你可以在纯粹的 Java 中做到这一点。我很确定您需要 运行 外部命令或调用本机代码来检测 JAR 文件是否在网络共享上。
您需要做的第一部分是获取 JAR 文件的绝对路径:
Class mainClass = MyMainClass.class;
File jarFile = new File(mainClass.getProtectionDomain()
.getCodeSource()
.getLocation()
.toURI());
我在 github 上找到了 Aaron Digulla 写的 "gist",它完成了任务的第二部分:
Aaron的代码采用Windows绝对路径,提取盘符然后运行s Windows net use <drive-letter>:
命令测试该驱动器是否为共享驱动器.
另一种方法是实现批处理文件执行以下操作的逻辑:
- 提取 JAR 文件的驱动器名称
- 使用
net use ...
测试共享驱动器 - 使用相同的技术检查 Java 安装是否也不在共享驱动器上1.
- 使用
java
命令启动应用程序
最后,拒绝 运行 共享驱动器可能不是一个好主意。用户可能有这样做的原因,而您并不知道。我建议提示用户并让用户选择继续。或者类似的东西。
或者,在应用程序的安装说明中记录 不建议 在共享驱动器(或等效驱动器)上安装 JRE / JDK 和应用程序。
1 - Java 安装在共享驱动器上的性能与共享驱动器上的应用程序 JAR 一样差,甚至更差。