我有一个项目的任务,包含4个使用Maven的嵌套子项目:
文件不是Java - 主要是各种脚本和HTML
我正在查看各种插件来帮助完成任务:assembly,dependency,antrun,unzip。依赖性看起来很有希望,但我不仅需要解压缩依赖jar,还要解压缩(子)项目内容。此外,由于我无法真正将操作紧缩到Maven生命周期,我将如何触发远程安装? mvn依赖:unpack?这不是非常具有描述性或直观性。是否可以在不编写插件的情况下创建自定义目标(例如project:install)?
使用Maven是公司标准,所以请不要提供替代方案 - 我几乎坚持我拥有的东西
答案 0 :(得分:13)
好的,我认为以下可能会做你需要的。这种方法的缺点是,在执行后续构建时,每个部署之间将存在间隔。这可以接受吗?
在每个项目中使用相同的名称定义配置文件(例如“发布”)。在该配置文件中,您可以定义配置以使用antrun-plugin通过FTP传送文件(参见下文)。
在父项目中,您将拥有一个modules元素,将每个项目定义为一个模块。如果运行mvn install -P publish
,将在启用发布配置文件的情况下依次构建每个项目,并在安装阶段将最终工件发布到目标。如果您需要部署其他文件,请相应地修改包含element
。
请注意,FTP任务的参数已设置为属性,这允许从命令行覆盖和/或从父POM继承它们。
<profiles>
<profile>
<id>publish</id>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<id>ftp</id>
<phase>install</phase>
<configuration>
<tasks>
<ftp action="send"
server="${ftp.host}" remotedir="${ftp.remotedir}"
userid="${ftp.userid}" password="${ftp.password}"
depends="${ftp.depends}" verbose="${ftp.verbose}">
<fileset dir="${project.build.directory}">
<include
name="${project.build.finalName}.${project.packaging}"/>
</fileset>
</ftp>
</tasks>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>1.4.1</version>
</dependency>
<dependency>
<groupId>ant</groupId>
<artifactId>ant-commons-net</artifactId>
<version>1.6.5</version>
</dependency>
<dependency>
<groupId>ant</groupId>
<artifactId>ant-nodeps</artifactId>
<version>1.6.5</version>
</dependency>
</dependencies>
</plugin>
<properties>
<ftp.host>hostname</ftp.host>
<ftp.remotedir>/opt/path/to/install</ftp.remotedir>
<ftp.userid>user</ftp.userid>
<ftp.password>mypassword</ftp.password>
<ftp.depends>yes</ftp.depends>
<ftp.verbose>no</ftp.verbose>
</properties>
</profile>
</profiles>
更新:根据您的评论:您可以使用依赖插件下载每个依赖项,但父级不能依赖子级,并且它将在子级之前构建。它必须是另一个项目。您还需要在某处获取将其部署到何处的信息。目前,您在各个项目中都有目标信息,因此在部署项目中无法访问它。
采用这种方法,您可以在新项目中定义多个配置文件,每个工件一个。每个配置文件都定义了一个依赖项:复制执行以获取jar,并为其中一个项目执行antrun执行。可以从配置文件中拉出常见配置(例如antrun插件的依赖项)。另请注意,如果您定义多个配置文件,属性将被合并,因此您可能需要使用工件名称限定它们,例如ftp.artifact1.host
。
<profiles>
<profile>
<id>deploy-artifact1</id>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependency</id>
<phase>prepare-package</phase>
<goals>
<goal>copy</goal>
</goals>
<configuration>
<artifactItems>
<artifactItem>
<groupId>name.seller.rich</groupId>
<artifactId>artifact1</artifactId>
<version>1.0.0</version>
<type>jar</type>
<overWrite>false</overWrite>
</artifactItem>
</artifactItems>
<outputDirectory>${project.build.directory}/deploy-staging</outputDirectory>
<overWriteReleases>false</overWriteReleases>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<id>ftp</id>
<phase>install</phase>
<configuration>
<tasks>
<ftp action="send"
server="${ftp.host}" remotedir="${ftp.remotedir}"
userid="${ftp.userid}" password="${ftp.password}"
depends="${ftp.depends}" verbose="${ftp.verbose}">
<fileset dir="${project.build.directory} includes="deploy-staging/"/>
</ftp>
</tasks>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
<properties>
<!--if the properties differ between targets, qualify them with the artifact name-->
<ftp.host>hostname</ftp.host>
<ftp.remotedir>/opt/path/to/install</ftp.remotedir>
<ftp.userid>user</ftp.userid>
<ftp.password>mypassword</ftp.password>
<ftp.depends>yes</ftp.depends>
<ftp.verbose>no</ftp.verbose>
</properties>
</profile>
</profiles>
答案 1 :(得分:5)
POM下面有助于将jar的文件从项目构建目录复制到远程SFTP / FTP服务器。
由于出于安全原因我想从命令提示符传递密码,我使用了 -Dftp.password = password 执行上述命令后,maven项目目标文件夹中的所有jar文件将部署在server.com上的MAVEN文件夹中
<plugin> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<id>ftp</id>
<phase>install</phase>
<configuration>
<tasks>
<scp todir="user@server.com:/MAVEN/"
sftp="true" port="22" trust="true" password="${ftp.password}"
failonerror="false" verbose="true" passphrase="">
<fileset dir="${project.build.directory}">
<include name="*.jar" />
</fileset>
</scp>
</tasks>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>org.apache.ant</groupId>
<artifactId>ant-jsch</artifactId>
<version>1.9.4</version>
</dependency>
</dependencies>
</plugin>
答案 2 :(得分:1)
没有密码短语不起作用。
<profile>
<id>publish</id>
<build>
<plugins>
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<id>scp</id>
<phase>deploy</phase>
<configuration>
<tasks>
<scp todir="user@host:some/remote/dir"
sftp="true"
keyfile="${user.home}/.ssh/devel-deploy.id_dsa"
failonerror="false"
verbose="true"
passphrase="nopass"
>
<fileset dir="${project.build.directory}">
<include
name="${project.build.finalName}.${project.packaging}"/>
</fileset>
</scp>
</tasks>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>org.apache.ant</groupId>
<artifactId>ant-jsch</artifactId>
<version>1.9.4</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
</profile>
然而,我最喜欢的是
<profile>
<id>upload-devel</id>
<build>
<plugins>
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<id>upload-devel</id>
<phase>deploy</phase>
<configuration>
<target>
<exec executable="rsync" failonerror="false">
<arg value="-aiz" />
<arg value="${project.build.directory}/${project.artifactId}.${project.packaging}" />
<arg value="user@host:some/remote/dir/." />
</exec>
</target>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
虽然我不知道在不同平台上的兼容性。
答案 3 :(得分:0)
我会考虑使用maven-assembly-plugin来执行此操作。
这样的东西可以用来从子项目中获取文件并将它们填充到输出目录中。
<assembly>
<id>xyzzy</id>
<formats>
<format>zip</format>
</formats>
<fileSets>
<fileSet>
<directory>../subproject1/target/</directory>
<outputDirectory>/foo</outputDirectory>
<includes>
<include>*.jar</include>
</includes>
</fileSet>
<fileSet>
<directory>../subproject1/target/html-output/</directory>
<outputDirectory>/foo</outputDirectory>
<includes>
<include>*.html</include>
<include>*.js</include>
<include>*.css</include>
</includes>
</fileSet>
<fileSet>
<directory>../subproject2/target/</directory>
<outputDirectory>/bar</outputDirectory>
<includes>
<include>**/**</include>
</includes>
<excludes>
<exclude>**/*.exclude-this</exclude>
</excludes>
</fileSet>
</fileSets>
</assembly>
答案 4 :(得分:0)
Maven并不是真的可以将jar部署到远程位置;它的主要用途是编译和包装工件。程序集和依赖项目标主要用于收集依赖项和文件以打包到工件中。
话虽如此,maven确实有一个使用名为wagon的组件的部署目标。这主要用于部署到maven存储库。有一个名为Cargo的插件可用于将工件部署到远程服务器,但这不会自动爆炸jar内容(它依赖于目标应用服务器来完成所有这些)。您可以自己扩展Maven Wagon功能。
此外,可以打包一个自定义生命周期,但这是进入一些非常低级别的maven mojo(双关语)。