如何使用maven解压缩符号链接?

时间:2013-02-06 16:24:17

标签: unix maven zip symlink

我有一个存储在zip文件中的符号链接。

使用Mac OS系统解压缩该文件时,会保留符号链接(也就是说它们是符号链接并且是这样的)。

但是,当使用maven(特别是unpack-dependencies mojo)解压缩它们时,它们显示为简单文件。

那么,是否有maven插件保留该标志?

3 个答案:

答案 0 :(得分:2)

我建议试试truezip-maven-plugin

答案 1 :(得分:1)

所有操作系统都没有实现符号链接。事实上,在看了javadocs之后,我根本不认为SDK完全支持这种zip条目 - 从我所知道的,它只是文件和目录。由于这个原因,我不会说它是依赖插件的限制。

答案 2 :(得分:0)

根据其他答案,似乎很少有纯Java库允许解压缩符号链接。

在这样的解决方案中,要有一个纯粹的多平台构建,人们不会简单地为每个操作系统创建一个模块,因为它会导致经典的模块军备竞赛,更实际的是,它不适合这个模块的生命周期

因此,我使用了经典的scripting-in-maven解决方案:GMaven

导致这个不那么漂亮的剧本

            <plugin>
                <groupId>org.codehaus.gmaven</groupId>
                <artifactId>gmaven-plugin</artifactId>
                <executions>
                    <execution>
                        <id>unzip native code using Groovy</id>
                        <phase>prepare-package</phase>
                        <goals>
                            <goal>execute</goal>
                        </goals>
                        <configuration>
                            <providerSelection>${gmaven.provider.version}</providerSelection>
                            <source>
<![CDATA[

def ant = new AntBuilder()

def FOLDERS_TO_EXPLORE = [] /* put here the list of folders in which zip files will be recursively searched */

def unzip(File file) {
    def RUN_ON_WINDOWS = System.getProperty("os.name").toLowerCase().indexOf("win")>=0
    if(RUN_ON_WINDOWS) {
        log.debug "unzipping windows style"
        ant.unzip(  src: file, dest:file.parentFile,  overwrite:"true")
    } else {
        def result = ant.exec(outputproperty:"text",
                 errorproperty: "error",
                 resultproperty: "exitValue",
                 dir: file.parent,
                 failonerror: true,
                 executable: "unzip") {
                       arg(value:file.name)
                 }

        if(Integer.parseInt(ant.project.properties.exitValue)!=0) {
            log.error "unable to unzip "+file.name+" exit value is "+ant.project.properties.exitValue
            log.error "=========================================================\noutput\n=========================================================\n"+ant.project.properties.text
            log.error "=========================================================\nerror\n=========================================================\n"+ant.project.properties.error
            fail("unable to unzip "+file)
        } else {
            log.info "unzipped "+file.name
        }
    }
    file.delete()
}

def unzipContentOf(File file) {
    file.eachFileRecurse { 
        if(it.name.toLowerCase().endsWith("zip")) {
            unzip(it)
        }
    }
}

FOLDERS_TO_EXPLORE.each { unzipContentOf(new File(it)) }
]]>