使用 exec 插件从 Maven 3 执行脚本 - 被阻止
Posted
技术标签:
【中文标题】使用 exec 插件从 Maven 3 执行脚本 - 被阻止【英文标题】:Executing a script from Maven 3 using exec plugin - gets blocked 【发布时间】:2011-10-18 10:13:12 【问题描述】:这是我面临的情况:目前我有两个 Maven 项目,一个只描述依赖项、存储库等(父级)和一个继承另一个 pom.xml 的子级。未来还会有更多的模块,跟孩子一样的模式。
我们决定将项目的站点(使用 maven-site-plugin 生成)部署到目前只能通过 sftp 访问的位置。而且我发现无法在<distributionManagement>
中定义站点位置,因为我无法集成 sftp 协议(我尝试使用 wagon-ssh-external)。
因此,我创建了一个脚本,该脚本连接到远程计算机并在 site-deploy 阶段上传我们的站点部署到的本地文件夹的内容:
echo "Uploading the site.."
lftp -u $username,$password sftp://$host <<EOF
mirror -R --delete-first $sitedir $remotedir
echo "Exiting from lftp.."
bye
EOF
echo "Terminating script execution.."
这对父站点非常有效,在本地创建站点后立即上传站点,但是当子站点到达脚本末尾时,它无法正确完成,打印 Terminating script execution..
并停留在那里。
我正在使用 Eclipse,这是带有默认 Maven 插件 (v. 3.0.2) 的最新版本 (3.7)。为了在 Eclipse 中生成和部署站点,我右键单击父项目 > 运行方式 > Maven 构建... > parent clean site-deploy
。
这些是父母pom.xml
的一部分:
<distributionManagement>
<!-- Generate the site locally, then it'll be uploaded to the server -->
<!-- Children will append their artifact ID to the base url -->
<site>
<id>project-name</id>
<name>Project Name</name>
<url>file://$env.HOME/testsite/</url>
</site>
</distributionManagement>
...
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.2.1</version>
</plugin>
</plugins>
</pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-site-plugin</artifactId>
<version>3.0</version>
<configuration>
...
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<inherited>false</inherited>
<executions>
<execution>
<id>sh</id>
<phase>site-deploy</phase>
<goals>
<goal>exec</goal>
</goals>
<configuration>
<executable>sh</executable>
<arguments>
<argument>publish-site.sh</argument>
<argument>$localsitedir</argument>
...
</arguments>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
从孩子那里:
<build>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<executions>
<execution>
<id>sh</id>
<phase>site-deploy</phase>
<goals>
<goal>exec</goal>
</goals>
<configuration>
<executable>sh</executable>
<arguments>
<argument>../parent/publish-site.sh</argument>
<argument>$localsitedir/child</argument>
...
</arguments>
</configuration>
</execution>
</executions>
</plugin>
</build>
我尝试了不同的方法来配置 exec 插件(不使用pluginManagement
,继承插件的父级配置,只重写参数部分等),它总是得到在完成脚本时被阻止并且不会结束执行。
该站点已正确上传,但当然,我不想在每次要更新站点时手动终止 Maven 构建执行(另外,计划将项目中的工件部署到 Jenkins 服务器,所以希望到那时站点部署可以正常工作)。
【问题讨论】:
这听起来可能很愚蠢,但是您是否尝试在 publish-site.sh 的末尾添加 exit 0 语句? 【参考方案1】:我的回答是基于很多猜测......我遇到了一个关于不终止的 SSH 命令的类似问题,原因是:
也许“lftp”启动了一个不退出的进程,并且也许(可能)maven-exec 插件在 stdout 和 stderr 上循环以在退出之前打印所有相关消息。如果没有被所有作家关闭,它就会卡住。
尝试将 'lftp' 的输出重定向到 /dev/null,以防万一。
【讨论】:
以上是关于使用 exec 插件从 Maven 3 执行脚本 - 被阻止的主要内容,如果未能解决你的问题,请参考以下文章
即使脚本使用“开始”,使用 Maven exec 插件启动 Windows 批处理脚本也会阻止构建