Maven 程序集插件:包含文件而不采用其路径文件夹
Maven assembly plugin: include file without taking its path folders
我正在使用 maven-assembly-plugin 将来自依赖项 ZIP(也是使用程序集插件生成)的文件包含到最终发布的 ZIP 文件中。
问题是我想 select 从依赖项中获取哪些文件,但不复制这些文件所在的文件夹路径。只是文件。
例如:
<assembly>
<formats>
<format>zip</format>
<format>dir</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<dependencySets>
<dependencySet>
<includes>
<include>package:artifactId:zip:*</include>
</includes>
<outputDirectory>sql/update/01.00.00_to_01.01.00</outputDirectory>
<unpack>true</unpack>
<unpackOptions>
<includes>
<include>oracle/update/1_alter_schema.sql</include>
<include>oracle/update/2_insert_data.sql</include>
</includes>
</unpackOptions>
<useProjectArtifact>false</useProjectArtifact>
<useTransitiveDependencies>false</useTransitiveDependencies>
</dependencySet>
</dependencySet>
</assembly>
这会像这样复制所需的文件:
- sql/update/01.00.00_to_01.01.00/oracle/update/1_alter_schema.sql
- sql/update/01.00.00_to_01.01.00/oracle/update/2_insert_data.sql
我想只复制没有原始 oracle/update/ 文件夹的文件,结果是这个文件夹结构:
- sql/update/01.00.00_to_01.01.00/1_alter_schema.sql
- sql/update/01.00.00_to_01.01.00/2_insert_data.sql
依赖 ZIP 包含许多不同项目使用的文件,因此区分 oracle 和 sql-server 文件的结构在那里很有意义,但对于此分发我不需要那些文件夹,只需要文件.
有人知道 maven-assembly-plugin 是否可行吗?
非常感谢!
它应该通过拆分依赖项解压缩和文件组装来工作。
配置 dependency-plugin 以在执行组装工作之前解压所需的依赖项:
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<configuration>
<includeArtifactIds>project-sql</includeArtifactIds>
<outputDirectory>${project.build.directory}/extract</outputDirectory>
<includes>oracle/update/1_alter_schema.sql,oracle/update/2_insert_data.sql</includes>
</configuration>
<executions>
<execution>
<id>unpack-sql</id>
<phase>prepare-package</phase>
<goals><goal>unpack-dependencies</goal></goals>
</execution>
</executions>
</plugin>
然后,在您的 assembly-distribution.xml 中,只需 assemble 来自子目录:
<?xml version="1.0" encoding="UTF-8"?>
<assembly
xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
<id>distribution-${project.version}</id>
<formats>
<format>zip</format>
<format>dir</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<fileSets>
<fileSet>
<directory>${project.build.directory}/extract/oracle/update</directory>
<outputDirectory>sql/update/01.00.00_to_01.01.00</outputDirectory>
</fileSet>
</fileSets>
</assembly>
从 maven-assembly-plugin (maven-assembly-plugin) 的文档可以看出,<fileSets>
标签没有为我们提供更改包含资源路径的选项。相反,我们可以使用 <file>
标签,它给了我们这种灵活性。
例如,下面的配置将在解压缩的 zip 文件的根文件夹中包括 file1.jar 和 run.bat,跳过它们的原始路径。
<assembly>
<formats>
<format>zip</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<files>
<file>
<source>target/file1.jar</source>
<destName>file1.jar</destName>
</file>
<file>
<source>src/main/resources/run.bat</source>
<destName>run.bat</destName>
</file>
</files>
</assembly>
我有同样的问题,使用依赖插件转储了很多其他文件,我相信它可以改进。但我想我找到了一个更简单更好的解决方案。
您需要做的就是再添加一个 <fileSet>
。 fileSet 具有相对源路径和输出目录。 outputDirectory 的值决定了生成的 zip 中的路径。它是如此简单。希望这可以帮助那些为 AWS 生产 lambda zip 的人(翻白眼)
这是我在 assembly.xml 之前(有问题)遇到的问题:
<assembly>
<formats>
<format>zip</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<fileSets>
<fileSet>
<directory></directory>
<outputDirectory/>
<includes>
<include>lib/**.*</include>
<include>${basedir}/target/classes/com/abc/test.LambdaTest.*</include>
</includes>
</fileSet>
</fileSets>
</assembly>
以上生成带有目录目标的 zip,但这里是经过改进和修复(正确)的,它在 zip 中没有路径“target”。
<assembly>
<formats>
<format>zip</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<fileSets>
<fileSet>
<directory></directory>
<outputDirectory/>
<includes>
<include>lib/**.*</include>
</includes>
</fileSet>
<fileSet>
<directory>${basedir}/target/classes</directory>
<outputDirectory/>
<includes>
<include>com/abc/test.LambdaTest.*</include>
</includes>
</fileSet>
</fileSets>
</assembly>
注意两个fileSets中<directory>
的值,它提供了一个相对路径,在文件添加到zip时不习惯
我正在使用 maven-assembly-plugin 将来自依赖项 ZIP(也是使用程序集插件生成)的文件包含到最终发布的 ZIP 文件中。
问题是我想 select 从依赖项中获取哪些文件,但不复制这些文件所在的文件夹路径。只是文件。
例如:
<assembly>
<formats>
<format>zip</format>
<format>dir</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<dependencySets>
<dependencySet>
<includes>
<include>package:artifactId:zip:*</include>
</includes>
<outputDirectory>sql/update/01.00.00_to_01.01.00</outputDirectory>
<unpack>true</unpack>
<unpackOptions>
<includes>
<include>oracle/update/1_alter_schema.sql</include>
<include>oracle/update/2_insert_data.sql</include>
</includes>
</unpackOptions>
<useProjectArtifact>false</useProjectArtifact>
<useTransitiveDependencies>false</useTransitiveDependencies>
</dependencySet>
</dependencySet>
</assembly>
这会像这样复制所需的文件:
- sql/update/01.00.00_to_01.01.00/oracle/update/1_alter_schema.sql
- sql/update/01.00.00_to_01.01.00/oracle/update/2_insert_data.sql
我想只复制没有原始 oracle/update/ 文件夹的文件,结果是这个文件夹结构:
- sql/update/01.00.00_to_01.01.00/1_alter_schema.sql
- sql/update/01.00.00_to_01.01.00/2_insert_data.sql
依赖 ZIP 包含许多不同项目使用的文件,因此区分 oracle 和 sql-server 文件的结构在那里很有意义,但对于此分发我不需要那些文件夹,只需要文件.
有人知道 maven-assembly-plugin 是否可行吗?
非常感谢!
它应该通过拆分依赖项解压缩和文件组装来工作。
配置 dependency-plugin 以在执行组装工作之前解压所需的依赖项:
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<configuration>
<includeArtifactIds>project-sql</includeArtifactIds>
<outputDirectory>${project.build.directory}/extract</outputDirectory>
<includes>oracle/update/1_alter_schema.sql,oracle/update/2_insert_data.sql</includes>
</configuration>
<executions>
<execution>
<id>unpack-sql</id>
<phase>prepare-package</phase>
<goals><goal>unpack-dependencies</goal></goals>
</execution>
</executions>
</plugin>
然后,在您的 assembly-distribution.xml 中,只需 assemble 来自子目录:
<?xml version="1.0" encoding="UTF-8"?>
<assembly
xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
<id>distribution-${project.version}</id>
<formats>
<format>zip</format>
<format>dir</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<fileSets>
<fileSet>
<directory>${project.build.directory}/extract/oracle/update</directory>
<outputDirectory>sql/update/01.00.00_to_01.01.00</outputDirectory>
</fileSet>
</fileSets>
</assembly>
从 maven-assembly-plugin (maven-assembly-plugin) 的文档可以看出,<fileSets>
标签没有为我们提供更改包含资源路径的选项。相反,我们可以使用 <file>
标签,它给了我们这种灵活性。
例如,下面的配置将在解压缩的 zip 文件的根文件夹中包括 file1.jar 和 run.bat,跳过它们的原始路径。
<assembly>
<formats>
<format>zip</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<files>
<file>
<source>target/file1.jar</source>
<destName>file1.jar</destName>
</file>
<file>
<source>src/main/resources/run.bat</source>
<destName>run.bat</destName>
</file>
</files>
</assembly>
我有同样的问题,使用依赖插件转储了很多其他文件,我相信它可以改进。但我想我找到了一个更简单更好的解决方案。
您需要做的就是再添加一个 <fileSet>
。 fileSet 具有相对源路径和输出目录。 outputDirectory 的值决定了生成的 zip 中的路径。它是如此简单。希望这可以帮助那些为 AWS 生产 lambda zip 的人(翻白眼)
这是我在 assembly.xml 之前(有问题)遇到的问题:
<assembly>
<formats>
<format>zip</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<fileSets>
<fileSet>
<directory></directory>
<outputDirectory/>
<includes>
<include>lib/**.*</include>
<include>${basedir}/target/classes/com/abc/test.LambdaTest.*</include>
</includes>
</fileSet>
</fileSets>
</assembly>
以上生成带有目录目标的 zip,但这里是经过改进和修复(正确)的,它在 zip 中没有路径“target”。
<assembly>
<formats>
<format>zip</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<fileSets>
<fileSet>
<directory></directory>
<outputDirectory/>
<includes>
<include>lib/**.*</include>
</includes>
</fileSet>
<fileSet>
<directory>${basedir}/target/classes</directory>
<outputDirectory/>
<includes>
<include>com/abc/test.LambdaTest.*</include>
</includes>
</fileSet>
</fileSets>
</assembly>
注意两个fileSets中<directory>
的值,它提供了一个相对路径,在文件添加到zip时不习惯