4

我正在使用 ant、ivy 和 nexus repo manager 来构建和存储我的工件。我设法让一切正常:依赖解析和发布。直到我遇到问题......(当然!)。

我正在发布到 nexus 中的“发布”存储库,该存储库被锁定为“禁用重新部署”(即使您将设置更改为“允许重新部署”(在 imo 那里真的很蹩脚的 UI)。你可以想象我当时有多生气在我意识到发生这种情况之前,我的更改并没有通过 repo 更新。

无论如何,我现在必须切换所有内容以在 nexus 中使用“快照”存储库。问题是这弄乱了我的发布。我尝试了很多东西,包括广泛的谷歌搜索,但什么都没有。我得到的错误是一个错误的 PUT 请求,错误代码 400。

有这个工作的人可以给我一个关于我缺少什么的指针。

非常感谢,

阿拉斯泰尔

仅供参考,这是我的配置:

请注意,我已经删除了任何让快照工作的尝试,因为我不知道什么是实际(可能)有用的,什么是完全的胡说八道。因此,这是仅工作版本的设置。

另外,请注意我添加了 XXX-API ivy.xml 仅供参考。我什至无法发布 xxx-common(甚至没有依赖项)。

蚂蚁任务:

<target name="publish" depends="init-publish">

  <property name="project.generated.ivy.file" value="${project.artifact.dir}/ivy.xml"/>
  <property name="project.pom.file" value="${project.artifact.dir}/${project.handle}.pom"/>

  <echo message="Artifact dir: ${project.artifact.dir}"/>
  <ivy:deliver 
    deliverpattern="${project.generated.ivy.file}" 
    organisation="${project.organisation}" 
    module="${project.artifact}" 
    status="integration" 
    revision="${project.revision}" 
    pubrevision="${project.revision}" /> 

  <ivy:resolve  />

  <ivy:makepom 
    ivyfile="${project.generated.ivy.file}" 
    pomfile="${project.pom.file}"/>

  <ivy:publish 
     resolver="${ivy.omnicache.publisher}" 
     module="${project.artifact}"
     organisation="${project.organisation}"
     revision="${project.revision}"
     pubrevision="${project.revision}"
     pubdate="now" 
     overwrite="true"  
     publishivy="true" 
     status="integration"
     artifactspattern="${project.artifact.dir}/[artifact]-[revision](-[classifier]).[ext]" 
     />


 </target> 

几个 ivy 文件给出内部依赖的概念:

XXX-普通项目:

<ivy-module version="2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:noNamespaceSchemaLocation="http://ant.apache.org/ivy/schemas/ivy.xsd">
    <info
        organisation="com.myorg.xxx"
        module="xxx_common"
        status="integration"
        revision="1.0">
 </info>
 <publications>  
     <artifact name="xxx_common" type="jar" ext="jar"/>  
     <artifact name="xxx_common" type="pom" ext="pom"/>       
 </publications>  
    <dependencies>
    </dependencies>
</ivy-module>

XXX-API 项目:

<ivy-module version="2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:noNamespaceSchemaLocation="http://ant.apache.org/ivy/schemas/ivy.xsd">
    <info
        organisation="com.myorg.xxx"
        module="xxx_api"
        status="integration"
        revision="1.0">
 </info>
 <publications>  
     <artifact name="xxx_api" type="jar" ext="jar"/>  
     <artifact name="xxx_api" type="pom" ext="pom"/>       
 </publications>  
    <dependencies> 
        <dependency org="com.myorg.xxx" name="xxx_common" rev="1.0" transitive="true" />
    </dependencies>
</ivy-module>

常春藤设置.xml:

<ivysettings>

 <properties file="${ivy.project.dir}/project.properties" />


 <settings
  defaultResolver="chain" 
  defaultConflictManager="all" />

 <credentials host="${ivy.credentials.host}" realm="Sonatype Nexus Repository Manager" username="${ivy.credentials.username}" passwd="${ivy.credentials.passwd}" />  

 <caches>
   <cache name="ivy.cache" basedir="${ivy.cache.dir}" />
 </caches> 

 <resolvers>
  <ibiblio name="xxx_publisher" m2compatible="true" root="${ivy.xxx.publish.url}" />
  <chain name="chain">
   <url name="xxx">  
    <ivy pattern="${ivy.xxx.repo.url}/com/myorg/xxx/[module]/[revision]/ivy-[revision].xml" />  
    <artifact pattern="${ivy.xxx.repo.url}/com/myorg/xxx/[module]/[revision]/[artifact]-[revision].[ext]" /> 
   </url>         
   <ibiblio name="xxx" m2compatible="true" root="${ivy.xxx.repo.url}"/>
   <ibiblio name="public" m2compatible="true" root="${ivy.master.repo.url}" />      
   <url name="com.springsource.repository.bundles.release">  
    <ivy pattern="http://repository.springsource.com/ivy/bundles/release/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]" />  
    <artifact pattern="http://repository.springsource.com/ivy/bundles/release/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]" /> 
   </url> 
   <url name="com.springsource.repository.bundles.external">  
    <ivy pattern="http://repository.springsource.com/ivy/bundles/external/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]" />  
    <artifact pattern="http://repository.springsource.com/ivy/bundles/external/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]" /> 
   </url> 
  </chain>
 </resolvers>



</ivysettings>
4

3 回答 3

3

w00h00t。

(向世界寻求帮助是一种宣泄。通常你可以更快地解决问题,即使没有回应)。

无论如何,对于感兴趣的人,它归结为几件事:

a) 在所有修订版中添加 -SNAPSHOT。这涉及派生第二个 ivy.xml -> ivy.SNAPSHOT.xml 并在 ivy ant 任务中明确引用它。b) 鉴于这是手动添加,我必须遍历整个构建文件树并为发布和快照流提供并行路径。在我看来,这是蹩脚的。但是,我猜我们极不可能发明任何其他类型的流程,这可能不会膨胀,并且 2 个并行流程将保持不变。c) 我为 ivy 指定了各种提示来检查快照的更新。例如checkUpdated="true"changePattern=".*-SNAPSHOT"在解析器上。并且添加

<modules org="myorg" name=*" resolveMode="dynamic" />

不过,如果能够自动集成快照内容,那就太好了。常春藤的一点(可选)聪明。让我们面对现实吧,像 nexus 这样的 maven repos 真的很有用,我当然使用 ivy 只是为了绕过 maven 糟糕的构建过程。我喜欢使用联结。

反正。如果有人想进一步对此提出质疑,请随意。

于 2010-06-07T16:15:04.150 回答
1

我不确定这是否有助于解决拥有 2 组配置的问题,但至少 build.xml 会更简单一些。

您可以将 ivy.xml 中 info 元素的修订属性定义为 ${project.revision}。

然后,您可以在 build.xml 中省略 ivy 元素的 revision="${project.revision}" 属性。

请参阅我对另一个问题的回答,例如: https ://stackoverflow.com/a/8853823/1148030

于 2012-01-13T16:53:11.820 回答
0

应该注意的是,唯一必要的步骤是在发布到 Nexus 时将“-SNAPSHOT”包含在修订中。答案中列出的其他步骤是可选/改进。要拉下已发布的项目,您还需要在修订中添加“-SNAPSHOT”。

于 2013-12-17T20:28:02.273 回答