5

我想为自己创建的工件拥有自己的 Maven 存储库,但是在尝试将 Maven 3 工件部署到自定义服务器时遇到问题。为了更好地解释这一点,我将提供一些信息:

  • 我正在使用 Maven 3
  • 我正在使用 Eclipse 开普勒
  • 我正在使用詹金斯
  • 远程服务器正在运行 Ubuntu Server 11.04
  • Jenkins 在 Ubuntu 服务器上运行
  • 我的本地机器正在运行 Windows XP

我的第一次尝试是用我的机器。我在 Eclipse 中运行 Maven 进行部署,一切正常。我将以下内容添加到我的项目 pom

    <build>
           ...
        <extensions>
            <extension>
                <groupId>org.apache.maven.wagon</groupId>
                <artifactId>wagon-ssh-external</artifactId>
                <version>1.0-beta-6</version>
            </extension>
        </extensions>
          ...
      </build>

...

<distributionManagement>
      <repository>
          <id>my server id</id>
          <name>my repository name</name>
          <url>scpexe://my server//path/to/my/repository</url>
      </repository>
  </distributionManagement>

在我的 settings.xml 我添加

<servers>  
      <server>  
          <id>my server id</id>  
         <username>server username</username>   
         <password>server password</password> 

         <configuration>
             <sshExecutable>plink</sshExecutable>
             <scpExecutable>pscp</scpExecutable>
         </configuration>  

     </server>  
 </servers>  

所以在我的本地机器上它可以工作,但我需要使用 Jenkins 来完成这项工作。我修改了 Jenkins settings.xml,因为它在 Linux 上运行,所以不需要 sshExecutable。Jenkins settings.xml 看起来像

<servers>  
      <server>  
          <id>my server id</id>  
         <username>server username</username>   
         <password>server password</password> 

     </server>  
 </servers>  

然后我修改 pom.xml 只执行 scp 而不是 scpexe

<distributionManagement>
      <repository>
          <id>my server id</id>
          <name>my repository name</name>
          <url>scp://my server//path/to/my/repository</url>
      </repository>
  </distributionManagement>

但是根据这个页面https://cwiki.apache.org/confluence/display/MAVEN/Maven+3.x+Compatibility+Notes maven 3 不支持 scp。我以任何方式运行它,我从 Jenkins 日志中收到以下错误消息

mavenExecutionResult exceptions not empty
message : Failed to execute goal org.apache.maven.plugins:maven-deploy-plugin:2.7:deploy (default-deploy) on project myproject: Failed to deploy artifacts/metadata: No connector available to access repository my_repository (scp://my server//path/to/my/repository) of type default using the available factories WagonRepositoryConnectorFactory
cause : Failed to deploy artifacts/metadata: No connector available to access repository my_repository (scp://my server//path/to/my/repository) of type default using the available factories WagonRepositoryConnectorFactory
Stack trace : 

如果我使用 scpexe 而不是 scp 我收到另一条错误消息

mavenExecutionResult exceptions not empty
message : Failed to execute goal org.apache.maven.plugins:maven-deploy-plugin:2.7:deploy (default-deploy) on project pruebanueva: Failed to deploy artifacts: Could not transfer artifact {$groupId}:{$artifactId}:{$package}:{$version} from/to my_repository (scpexe://my server//path/to/my/repository): Error executing command for transfer
cause : Failed to deploy artifacts: Could not transfer artifact {$groupId}:{$artifactId}:{$package}:{$version} from/to my_repository (scpexe://my server//path/to/my/repository): Error executing command for transfer
Stack trace : 

我可以进行部署的唯一方法是分两步进行

  1. 配置 Jenkins 以实现安装目标
  2. 从命令行运行以下命令

mvn deploy:deploy-file -DgroupId=$groupId -DartifactId=$artifactId -Dversion=$version -Dpackaging=jar -Dfile=path/to/file.jar -Durl=scp://my server//path/to/我的/存储库 -DrepositoryId=我的存储库 ID

我尝试了很多事情,包括将该命令写入 Jenkins 目标,但每次我在 Jenkins 中使用 scp 命令时,构建都会失败。

任何有关如何解决此问题的想法将不胜感激。

4

2 回答 2

6

我有兴趣看看是否有任何真正的 Maven 解决方案。我一直使用 Maven Antrun 插件解决这个问题,如下所示:

<profile>
  <id>deploy</id>
  <activation>
    <property>
      <name>deployment.server</name>
    </property>
  </activation>
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-antrun-plugin</artifactId>
        <version>1.7</version>
        <executions>
          <execution>
            <phase>deploy</phase>
            <goals>
              <goal>run</goal>
            </goals>
            <configuration>
              <target>
                <echo>deploying to server: ${deployment.server}</echo>
                <taskdef classname="org.apache.tools.ant.taskdefs.optional.ssh.Scp" name="scp" />
                <scp file="${project.build.directory}/${project.artifactId}.war" password="${deployment.password}" todir="${deployment.userName}@${deployment.server}:" trust="true" verbose="true" />
                <!-- <sshexec command="echo unity | sudo -S cp ${project.build.finalName}.jar $( if [ -e /station ]; then echo /station/lib; else echo /opt/pkg-station*/webapps/station*/WEB-INF/lib; fi )" host="${targetStation}" password="unity" trust="true" username="wps"></sshexec> -->
              </target>
            </configuration>
          </execution>
        </executions>
        <dependencies>
          <dependency>
            <groupId>com.jcraft</groupId>
            <artifactId>jsch</artifactId>
            <version>0.1.25</version>
          </dependency>
          <dependency>
            <groupId>org.apache.ant</groupId>
            <artifactId>ant-jsch</artifactId>
            <version>1.7.1</version>
          </dependency>
        </dependencies>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-deploy-plugin</artifactId>
        <version>2.7</version>
        <configuration>
          <skip>true</skip>
        </configuration>
      </plugin>
    </plugins>
  </build>
</profile>

关于这一点的几点说明:我通过运行到deploy阶段和提供deployment.server设置的组合来激活此配置文件。为了方便起见,我将相应的设置添加到我的settings.xml,这样我就不必每次都在命令行上提供这些:

<profile>
    <id>alwaysActiveProfile</id>
    <properties>
        <deployment.server>10.10.10.10</deployment.server>
        <deployment.userName>userName<deployment.userName>
        <deployment.password>password</deployment.password>
    </properties>
</profile>

skip是实际deploy目标,因为它将在我运行到deploy我不想要的阶段时执行。

于 2013-09-27T22:47:28.940 回答
0

Verhagen 的答案是正确的,但更纯粹的 Maven 解决方案是:https ://stackoverflow.com/a/3303525/1881318

于 2013-12-12T16:06:30.587 回答