2010-06-30 67 views
1

我想弄清楚如何读取perl中的java jar文件中的META-INF/MANIFEST.MF文件。我试图使用Mail::Header来分离清单中的属性。这工作正常,如果清单文件已经从jar中提取,但我想弄清楚如何提取清单到内存中,然后立即放入一个Header对象。这是我到目前为止有:Perl:从Java .jar文件读取MANIFEST.MF文件

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"); 

我想不通其中的构造和/或提取/读取功能用来读取$清单文件句柄。 (我是perl的新手)

回答

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'); 
+0

感谢daxim。适用于我。我试图做的唯一的其他问题是* .jar文件列表的解析问题。清单在列表的随机点中添加了额外的空格,所以这就是我所做的以':'分隔的jar文件列表。 (“。jar:”,split(“。jar”,join(“”,split(“”,$ headers-> get(“Class-Path”)))))。“。jar”; – Nikordaris 2010-07-01 15:03:56