jar命令不会打开隐藏目录中的jar文件
当 jar 文件移动到隐藏(点)目录后尝试打开该文件时,jar
命令会抛出 FileNotFoundException。我可以用一个简单的 jar 文件重现这个:
tklaus@kraken:~$ jar -c -f foo.jar test.c
tklaus@kraken:~$ jar -t -f foo.jar
META-INF/
META-INF/MANIFEST.MF
test.c
但是如果我将 jar 文件移动到隐藏目录:
tklaus@kraken:~$ mkdir .foo
tklaus@kraken:~$ mv foo.jar .foo/
jar 命令无法再读取它:
tklaus@kraken:~$ jar -t -f .foo/foo.jar
java.io.FileNotFoundException: ./.foo/foo.jar (Permission denied)
at java.base/java.io.RandomAccessFile.open0(Native Method)
at java.base/java.io.RandomAccessFile.open(RandomAccessFile.java:344)
at java.base/java.io.RandomAccessFile.<init>(RandomAccessFile.java:259)
at java.base/java.io.RandomAccessFile.<init>(RandomAccessFile.java:213)
at java.base/java.util.zip.ZipFile$Source.<init>(ZipFile.java:1312)
at java.base/java.util.zip.ZipFile$Source.get(ZipFile.java:1277)
at java.base/java.util.zip.ZipFile$CleanableResource.<init>(ZipFile.java:709)
at java.base/java.util.zip.ZipFile.<init>(ZipFile.java:243)
at java.base/java.util.zip.ZipFile.<init>(ZipFile.java:172)
at java.base/java.util.zip.ZipFile.<init>(ZipFile.java:143)
at jdk.jartool/sun.tools.jar.Main.list(Main.java:1484)
at jdk.jartool/sun.tools.jar.Main.run(Main.java:352)
at jdk.jartool/sun.tools.jar.Main.main(Main.java:1665)
我可以很好地读取该文件:
tklaus@kraken:~$ unzip -l .foo/foo.jar
Archive: .foo/foo.jar
Length Date Time Name
--------- ---------- ----- ----
0 2022-03-16 22:09 META-INF/
51 2022-03-16 22:09 META-INF/MANIFEST.MF
85 2022-03-12 17:10 test.c
--------- -------
tklaus@kraken:~$ ls -la .foo
total 12
drwxrwxr-x 2 tklaus tklaus 4096 Mar 16 22:09 .
drwxr-xr-x 26 tklaus tklaus 4096 Mar 17 12:29 ..
-rw-rw-r-- 1 tklaus tklaus 511 Mar 16 22:09 foo.jar
可能是什么原因导致的?这是我不知道的Java安全策略吗?
我的环境:
tklaus@kraken:~$ uname -a
Linux kraken 5.13.0-35-generic #40~20.04.1-Ubuntu SMP Mon Mar 7 09:18:32 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
tklaus@kraken:~$ java --version
openjdk 17.0.2 2022-01-18
OpenJDK Runtime Environment (build 17.0.2+8-snap)
OpenJDK 64-Bit Server VM (build 17.0.2+8-snap, mixed mode, sharing)
tklaus@kraken:~$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 20.04.4 LTS
Release: 20.04
Codename: focal
The jar
command is throwing a FileNotFoundException while trying to open a jar file after it has been moved to a hidden (dot) directory. I can reproduce this with a simple jar file:
tklaus@kraken:~$ jar -c -f foo.jar test.c
tklaus@kraken:~$ jar -t -f foo.jar
META-INF/
META-INF/MANIFEST.MF
test.c
But if I move the jar file to a hidden directory:
tklaus@kraken:~$ mkdir .foo
tklaus@kraken:~$ mv foo.jar .foo/
the jar command can no longer read it:
tklaus@kraken:~$ jar -t -f .foo/foo.jar
java.io.FileNotFoundException: ./.foo/foo.jar (Permission denied)
at java.base/java.io.RandomAccessFile.open0(Native Method)
at java.base/java.io.RandomAccessFile.open(RandomAccessFile.java:344)
at java.base/java.io.RandomAccessFile.<init>(RandomAccessFile.java:259)
at java.base/java.io.RandomAccessFile.<init>(RandomAccessFile.java:213)
at java.base/java.util.zip.ZipFile$Source.<init>(ZipFile.java:1312)
at java.base/java.util.zip.ZipFile$Source.get(ZipFile.java:1277)
at java.base/java.util.zip.ZipFile$CleanableResource.<init>(ZipFile.java:709)
at java.base/java.util.zip.ZipFile.<init>(ZipFile.java:243)
at java.base/java.util.zip.ZipFile.<init>(ZipFile.java:172)
at java.base/java.util.zip.ZipFile.<init>(ZipFile.java:143)
at jdk.jartool/sun.tools.jar.Main.list(Main.java:1484)
at jdk.jartool/sun.tools.jar.Main.run(Main.java:352)
at jdk.jartool/sun.tools.jar.Main.main(Main.java:1665)
I can read the file just fine:
tklaus@kraken:~$ unzip -l .foo/foo.jar
Archive: .foo/foo.jar
Length Date Time Name
--------- ---------- ----- ----
0 2022-03-16 22:09 META-INF/
51 2022-03-16 22:09 META-INF/MANIFEST.MF
85 2022-03-12 17:10 test.c
--------- -------
tklaus@kraken:~$ ls -la .foo
total 12
drwxrwxr-x 2 tklaus tklaus 4096 Mar 16 22:09 .
drwxr-xr-x 26 tklaus tklaus 4096 Mar 17 12:29 ..
-rw-rw-r-- 1 tklaus tklaus 511 Mar 16 22:09 foo.jar
What could be causing this? Is this a Java security policy that I don't know about?
My environment:
tklaus@kraken:~$ uname -a
Linux kraken 5.13.0-35-generic #40~20.04.1-Ubuntu SMP Mon Mar 7 09:18:32 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
tklaus@kraken:~$ java --version
openjdk 17.0.2 2022-01-18
OpenJDK Runtime Environment (build 17.0.2+8-snap)
OpenJDK 64-Bit Server VM (build 17.0.2+8-snap, mixed mode, sharing)
tklaus@kraken:~$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 20.04.4 LTS
Release: 20.04
Codename: focal
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论