Maven解压缩以忽略原始文件夹

时间:2015-05-24 16:40:15

标签: java maven

我的一个项目有这样的结构:

.\ca\<modulename>\dist\<modulename>.zip

我想创建一个只在单个包中包含zip文件的包,所以如果我有子模块mod1mod2modn,我最终会得到:

ZIP CONTENT:
  mod1.zip
  mod2.zip
  ...
  modn.zip

到目前为止我所做的是创建一个maven项目,使用maven dependencyassembly插件我得到了这个:

<plugins>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <executions>
                    <execution>
                        <id>unpack</id>
                        <phase>generate-sources</phase>
                        <goals>
                            <goal>unpack</goal>
                        </goals>

                        <configuration>
                            <artifactItems>
                                <artifactItem>
                                    <groupId>es.xunta.emprego.cntxes</groupId>
                                    <artifactId>myproject-cas</artifactId>
                                    <version>${cas.version}</version>
                                    <overWrite>true</overWrite>
                                    <outputDirectory>target/dependency</outputDirectory>
                                    <type>zip</type>
                                    <includes>ca/**/dist/*.zip</includes>
                                </artifactItem>
                            </artifactItems>
                        </configuration>
                    </execution>
                </executions>
            </plugin>


            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <configuration>
                    <descriptor>src/main/assembly/zip.xml</descriptor>
                    <appendAssemblyId>false</appendAssemblyId>
                </configuration>
                <executions>
                    <execution>
                        <id>make-assembly</id>
                        <!-- this is used for inheritance merges -->
                        <phase>package</phase>
                        <!-- append to the packaging phase. -->
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>

这是assembly/zip.xml

<?xml version="1.0" encoding="UTF-8" ?>
<assembly>
    <id>bin</id>
    <formats>
        <!-- formato de salida del empaquetado -->
        <format>zip</format>
    </formats>
    <includeBaseDirectory>false</includeBaseDirectory>
    <fileSets>
        <fileSet>
            <outputDirectory>/</outputDirectory>
            <directory>target/dependency</directory>
            <includes>
                <include>/**/dist/*.zip</include>
            </includes>
            <useDefaultExcludes>true</useDefaultExcludes>
        </fileSet>
    </fileSets>
</assembly>  

但这是尊重我原来的zip文件夹结构,所以结果是:

ZIP CONTENT
   ca\mod1\dist\mod1.zip
   ca\mod2\dist\mod2.zip
   ...
   ca\modn\dist\modn.zip

这似乎是一个小问题,但模块的数量很大,收集不同的zip文件非常烦人,不得不浏览每个文件夹。我一直在与assemblydependency挣扎,但还没有找到实现我想要的方法。请注意,我正在使用通配符(ca/**/dist/*.zip),因为在编译之前我不知道将存在的文件的名称。

请帮忙吗?

3 个答案:

答案 0 :(得分:3)

我不知道是否有办法解决这个问题,但这个问题可能有助于您找到解决方法:execute ant / groovy script inside maven

根据链接的答案,这是一个ANT示例(我现在不能尝试)和maven ANT插件:

<plugins>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-dependency-plugin</artifactId>
        <executions>
            <execution>
                <id>unpack</id>
                <phase>generate-sources</phase>
                <goals>
                    <goal>unpack</goal>
                </goals>
                <configuration>
                    <artifactItems>
                        <artifactItem>
                            <groupId>es.xunta.emprego.cntxes</groupId>
                            <artifactId>myproject-cas</artifactId>
                            <version>${cas.version}</version>
                            <overWrite>true</overWrite>
                            <outputDirectory>target/dependency</outputDirectory>
                            <type>zip</type>
                            <includes>ca/**/dist/*.zip</includes>
                        </artifactItem>
                    </artifactItems>
                </configuration>
            </execution>
        </executions>
    </plugin>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-antrun-plugin</artifactId>
        <version>1.8</version>
        <executions>
            <execution>
                <id>move</id>
                <phase>generate-sources</phase>
                <goals>
                    <goal>run</goal>
                </goals>
                <configuration>
                    <target>
                        <copy todir="${project.basedir}/target/dependency" flatten="true">
                            <fileset dir="${project.basedir}/ca">
                                <include name="**/dist/*.zip"/>
                            </fileset>
                        </copy>
                    </target>
                </configuration>
            </execution>
        </executions>
    </plugin>
    ...
</plugins>

至少,为了确保同一阶段的插件执行顺序,需要Maven 3.0.3版本。

答案 1 :(得分:0)

是否安装了mod1.zipmod2.zip等,还是可以将它们安装到本地存储库中?您可以使用maven-dependency-plugin

<dependencies>
    <dependency>
        <groupId>com.whatever</groupId>
        <artifactId>mod1</artifactId>
        <version>1.0.0-SNAPSHOT</version>
        <type>zip</type>
    <dependency>
</dependencies>
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <version>2.10</version>
            <executions>
                <execution>
                    <id>copy-dependencies</id>
                    <phase>validate</phase>
                    <goals>
                        <goal>copy-dependencies</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>${project.basedir}/dist</outputDirectory>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

这会让你回到维护这个依赖列表给定一个动态模块列表,但如果你能弄清楚如何使依赖列表动态化,那么这可能会让你更远。

答案 2 :(得分:0)

您需要在依赖项之间插件:unpack和程序集:单个任务可以展平您的资源。

您可以摆弄资源:复制资源任务,但这可能不会成功,如此处所确认:Maven : copy files without subdirectory structure

对于这种情况,如@Fabien的回答所述,创建了maven ant插件,以调用各种非标准行为。