【问题标题】:Perl: Read MANIFEST.MF file from Java .jar filePerl:从 Java .jar 文件中读取 MANIFEST.MF 文件
【发布时间】:2010-06-30 12:24:38
【问题描述】:

我试图弄清楚如何从 perl 中的 java jar 文件中读取 META-INF/MANIFEST.MF 文件。我正在尝试使用Mail::Header 来分隔清单中的属性。如果清单文件已经从 jar 中提取出来,这可以正常工作,但我试图弄清楚如何将清单提取到内存中,然后立即放入 Header 对象中。这是我目前所拥有的:

my $jarFile = "MyJar.jar";
my &jar = Archive::Zip->new($jarFile);

my $manifest = Archive::Zip::MemberRead->new($jar, "META-INF/MANIFEST.MF");

my $header = Mail::Header->new;
$header->read(????);

print $header->get("Class-Path");

我不知道使用哪个构造函数和/或哪个提取/读取函数来读取 $manifest 文件句柄。 (我是 perl 新手)

【问题讨论】:

    标签: perl jar header zip manifest


    【解决方案1】:

    MemberRead 有一个非常愚蠢的 API。它应该给出一个真实句柄,或者至少以兼容的方式模仿IO::File(所以我们将它传递给Mail::Header构造函数或者至少能够调用getlines method),但是没有。

    我们可以通过将文件内容临时存储在一个数组中来解决它的不兼容问题。

    my @lines;
    {
        my $handle = Archive::Zip->new($jar_file)->memberNamed('META-INF/MANIFEST.MF')->readFileHandle;
        while (defined(my $line = $handle->getline)) { # even $_ doesn't work!! what a piece of camel dung
            push @lines, $line;
        }
    }
    
    my $headers = Mail::Header->new([@lines]);
    print $headers->get('Class-Path');
    

    【讨论】:

    • 谢谢达西姆。为我工作。我尝试做的唯一其他问题是 *.jar 文件列表的解析问题。清单在列表的随机位置添加了额外的空格,所以这就是我为获取由“:”分隔的 jar 文件列表所做的操作。 join(".jar:", split(".jar", join("", split(" ", $headers->get("Class-Path"))))).".jar";
    猜你喜欢
    • 2011-04-16
    • 2011-10-27
    • 2017-01-26
    • 1970-01-01
    • 2015-03-25
    • 2012-11-22
    • 1970-01-01
    • 2010-09-29
    相关资源
    最近更新 更多