如何发布与常春藤和纽约的第三方文物

我忙着用常春藤把我的脚弄湿。 我有一个现有的nexus库在我的本地PC上运行,还有一个现有的ant编译脚本。
两者都很好。

构build脚本的一部分有一些文件从networking共享中检索我们的第三方jar文件(log4j,xmlbeans,junit,pdf等),这个文件最好是klunky。

我想使用ivy的依赖机制从nexus存储库检索这些文件,并在构build中使用它。 每个第三方库都有一个名称和任意一组文件(jar,dll,license.dat,xml等)。

由于我们有大量的这些第三方库,每个库都有多个文件 – 手动上传到nexus不是一个选项 – 我需要一些我可以用来获取一组文件,给他们一个lib名称,版本号和将结果上传到nexus。 那么我需要能够从常春藤检索这个。

我设法让上传部分工作,但是复原过程不起作用。 使用我们的xmlbeans库作为起点,我创build了下面的ivy.xml文件

<ivy-module version="1.0"> <info organisation="thirdparty_tools" module="xmlbeans" status="integration"> <publications> <artifact name="jsr173_api" type="jar" ext="jar"/> <artifact name="saxon-dom" type="jar" ext="jar"/> <artifact name="saxon-xpath" type="jar" ext="jar"/> <artifact name="saxon" type="jar" ext="jar"/> <artifact name="xbean" type="jar" ext="jar"/> <artifact name="xbean_xpath" type="jar" ext="jar"/> <artifact name="xmlpublic" type="jar" ext="jar"/> </publications> </ivy-module> 

然后用一些ant脚本将它发布到nexus:

  <ivy:resolve/> <ivy:publish <ivy:publish resolver="thirdparty" forcedeliver="true" update="true" revision="${version}" overwrite="true"> <artifacts pattern="[artifact].[ext]"/> <ivy:publish/> 

这一切工作正常。 它将所有的jar文件发布到nexus的预期目录中。

当我尝试在我的构build中使用它时遇到了麻烦。 我为我的构build创build了以下ivy.xml文件:

 <ivy-module version="1.0"> <info organisation="myCompany" module="GLB_Data"/> <dependencies> <dependency org="thirdparty_tools" name="xmlbeans" rev="2.2.0"/> </dependencies> </ivy-module> 

然后当我运行我的构build – 它找不到任何东西:

 :::::::::::::::::::::::::::::::::::::::::::::: :: UNRESOLVED DEPENDENCIES :: :::::::::::::::::::::::::::::::::::::::::::::: :: thirdparty_tools#jsr173_api;2.2.0: not found :: thirdparty_tools#saxon-dom;2.2.0: not found :: thirdparty_tools#saxon-xpath;2.2.0: not found :: thirdparty_tools#saxon;2.2.0: not found :: thirdparty_tools#xbean;2.2.0: not found :: thirdparty_tools#xbean_xpath;2.2.0: not found :: thirdparty_tools#xmlpublic;2.2.0: not found :::::::::::::::::::::::::::::::::::::::::::::: 

问题似乎是这样的:

 WARN: ==== public: tried WARN: http //localhost:8081/nexus/content/groups/public/thirdparty_tools/jsr173_api/2.2.0/jsr173_api-2.2.0.pom WARN: -- artifact thirdparty_tools#jsr173_api;2.2.0!jsr173_api.jar: WARN: http //localhost:8081/nexus/content/groups/public/thirdparty_tools/jsr173_api/2.2.0/jsr173_api-2.2.0.jar ivy seems to be looking for the jsr173_api artifact under its own name, rather than under the xmlbeans folder where it was published to: [ivy:publish] published jsr173_api to http //localhost:8081/nexus/content/repositories/thirdparty/thirdparty_tools/xmlbeans/2.2.0/jsr173_api-2.2.0.jar 

(为防止事故而被混淆)。

所以不知何故我需要不同的发布,或不同的检索。 想法和build议非常感谢。

Nexus主要是一个Maven仓库,这意味着必须适应Maven结构工件的方式。

由于您关注批量加载Nexus,因此build议您查看以下问题的答案:

将工件上传到Nexus,无需Maven

如果你想坚持常春藤阅读…..

背景

需要一个Maven POM

你的第一个问题是你的Maven模块将需要一个POM文件。 这个文件描述了maven模块,可以很容易地从ivy.xml文件的内容中生成(参见下面的解决scheme)。

其次,Maven假设有一个主要的神器正在build造中。 例如:

 <project> <modelVersion>4.0.0</modelVersion> <groupId>com.myspotontheweb</groupId> <artifactId>donaldduck</artifactId> <version>1.0.1</version> <packaging>txt</packaging> </project> 

Maven客户端会将这些信息翻译成以下URL:

 http://<host>/<repo>/com/myspotontheweb/donaldduck/1.0.1/donaldduck-1.0.1.txt 

这演示了Nexus如何存储任何types的二进制依赖项。 包装参数默认为“jar”。

maven如何处理额外的模块工件

尽pipeMaven专注于单个构build工件,但可以通过将其添加到同一个目录中来添加其他辅助工件(就像您所做的那样)。

这些不在 Maven POM中列出。 相反,Maven使用特殊的“分类器”属性。 以下是可能的依赖声明。

 <dependency> <groupId>com.myspotontheweb</groupId> <artifactId>donaldduck</artifactId> <version>1.0.1</version> <classifier>metadata</classifier> <type>n3</type> </dependency> 

Maven客户端将把它翻译成以下URL:

 http://<host>/<repo>/com/myspotontheweb/donaldduck/1.0.1/donaldduck-1.0.1-metadata.n3 

开源项目通常以这种方式发布他们的源代码。

常春藤解决scheme

那么最后如何使用ivy将文件发布到Nexus?

首先决定哪个工件是“主要”构build工件,并为您的POM文件添加一个额外的条目:

 <ivy-module version='2.0' xmlns:e="http://ant.apache.org/ivy/extra"> <info organisation="com.myspotonontheweb" module="donaldduck" revision="1.0.1"/> <publications> <artifact name="donaldduck" type="txt"/> <artifact name="donaldduck" type="pom"/> <artifact name="donaldduck" type="n3" e:classifier="metadata"/> <artifact name="donaldduck" type="zip" e:classifier="disto"/> </publications> </ivy-module> 

其他文件也可以列出,但每个都必须有一个独特的分类属性…..在这里,你将面临一个经典的问题翻译成一个ANT项目到Maven ….你发布的每个jar文件可能需要有一个单独的聚甲醛。 他们不是真正的“补充”文物…..

假装你不需要发布多个模块….使用下面的构build目标来发布你的模块:

 <target name="prepare" description="Generate POM"> <!-- Optional: Intermediate file containing resolved version numbers --> <ivy:deliver deliverpattern="${build.dir}/ivy.xml" pubrevision="${publish.revision}" status="release"/> <!-- Generate the Maven POM --> <ivy:makepom ivyfile="${build.dir}/ivy.xml" pomfile="${build.dir}/donaldduck.pom"/> </target> <target name="publish" depends="init,prepare" description="Upload to Nexus"> <ivy:publish resolver="nexus-deploy" pubrevision="${publish.revision}" overwrite="true" publishivy="false" > <artifacts pattern="${build.dir}/[artifact](-[classifier]).[ext]"/> </ivy:publish> </target> 

Nexus凭据

为了完整起见,这里是包含Nexus存储库位置和证书的ivysettings.xml文件:

 <ivysettings> <settings defaultResolver="nexus-central"/> <credentials host="somehost" realm="Sonatype Nexus Repository Manager" username="????" passwd="????"/> <resolvers> <ibiblio name="nexus-central" root="http://somehost/nexus/content/repositories/central/" m2compatible="true"/> <ibiblio name="nexus-deploy" root="http://somehost/nexus/content/repositories/repo" m2compatible="true"/> </resolvers> </ivysettings> 

更新

下载工件

要检索所有已发布的工件(不仅仅是主工件),您需要按如下方式列出它们:

 <dependency org="com.myspotontheweb" name="donaldduck" rev="1.0.1"> <artifact name="donaldduck" type="txt"/> <artifact name="donaldduck" type="n3" e:classifier="metadata"/> <artifact name="donaldduck" type="zip" e:classifier="distro"/> </dependency> 

function上与以下Maven片段相同:

 <dependency> <groupId>com.myspotontheweb</groupId> <artifactId>donaldduck</artifactId> <version>1.0.1</version> <type>txt</type> </dependency> <dependency> <groupId>com.myspotontheweb</groupId> <artifactId>donaldduck</artifactId> <version>1.0.1</version> <classifier>metadata</classifier> <type>n3</type> </dependency> <dependency> <groupId>com.myspotontheweb</groupId> <artifactId>donaldduck</artifactId> <version>1.0.1</version> <classifier>distro</classifier> <type>zip</type> </dependency>