jar命令不会打开隐藏目录中的jar文件

发布于 2025-01-14 21:54:54 字数 2513 浏览 3 评论 0原文

当 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文