maven-assembly-plugin生成tar与python的tarfile不兼容(与bsdtar一起使用)

时间:2014-03-11 18:16:43

标签: python maven tar maven-assembly-plugin tarfile

作为自动部署管道的一部分,我使用tar.gz创建maven-assembly-plugin文件,然后使用python' tarfile模块解压缩。

提取失败,但例外情况为:

Traceback (most recent call last): File "tarfile-assembly-testcase/extract_tar.py", line 20, in <module> tarfile.open(fileobj=f, mode='r:gz') File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/tarfile.py", line 1676, in open return func(name, filemode, fileobj, **kwargs) File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/tarfile.py", line 1725, in gzopen **kwargs) File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/tarfile.py", line 1703, in taropen return cls(name, mode, fileobj, **kwargs) File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/tarfile.py", line 1572, in __init__ self.firstmember = self.next() File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/tarfile.py", line 2335, in next raise ReadError(str(e)) ReadError: invalid header

压缩和未压缩的tar文件都会发生这种情况。可以从命令行解压缩相同的文件。我已使用bsdtar 2.8.3tar (GNU tar) 1.26对其进行了测试。我使用python 2.7

请尝试我在github上发布的demo。它是一个maven项目,运行mvn包它会创建一个包含项目源的tar.gz(只有pom.xml)。包含的python脚本尝试使用tarfile提取它。

maven-assembly-plugin和python&#39; s tarfile一起玩得好吗?

1 个答案:

答案 0 :(得分:3)

我发现了问题。复制解决方案后,我在Stackoverflow中找到here (see "Version pinning" paragraph)以供后代使用。

版本2.4的maven-assembly-plugin导入plexus-archiver的错误版本。强制maven-assembly-plugin使用最新的plexus-archiver就可以了。正如链接帖子中所建议的,我还升级了plexus-io

这是代码

<plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>2.4</version>
    <dependencies>
        <dependency>
            <groupId>org.codehaus.plexus</groupId>
            <artifactId>plexus-archiver</artifactId>
            <version>2.4.4</version>
        </dependency>
        <dependency>
            <groupId>org.codehaus.plexus</groupId>
            <artifactId>plexus-io</artifactId>
            <version>2.0.10</version>
        </dependency>
    </dependencies>
</plugin>