使用 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 批处理脚本也会阻止构建

Maven exec插件未运行

使用 Maven Exec 插件的多个命令

使用 Exec Maven 插件分叉 Java,而不使用 `exec` 目标

使用Maven运行Java main的3种方式

如何用exec-maven-plugin插件执行jar包