Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何仅将pom文件部署到Maven中的快照存储库中?_Maven_Maven Deploy Plugin - Fatal编程技术网

如何仅将pom文件部署到Maven中的快照存储库中?

如何仅将pom文件部署到Maven中的快照存储库中?,maven,maven-deploy-plugin,Maven,Maven Deploy Plugin,我希望在运行mvndeploy且版本为快照版本时,能够只部署POM工件(文件),而不部署主工件(JAR、WAR等) 为什么? 我们需要几个开发人员在多个Maven项目上工作。我们有一个Hudson服务器,每个Maven项目和版本都有一个作业(例如foo-1.2、foo-1.3)。每个作业构建项目并将其部署到Nexus服务器(成功后)。开发中的Maven项目通过在版本中使用-SNAPSHOT后缀进行标记。例如:1.2-SNAPSHOT、1.3-SNAPSHOT 下面是一个示例场景,说明开发人员的工

我希望在运行
mvndeploy
且版本为快照版本时,能够只部署POM工件(文件),而不部署主工件(JAR、WAR等)

为什么?

我们需要几个开发人员在多个Maven项目上工作。我们有一个Hudson服务器,每个Maven项目和版本都有一个作业(例如foo-1.2、foo-1.3)。每个作业构建项目并将其部署到Nexus服务器(成功后)。开发中的Maven项目通过在版本中使用-SNAPSHOT后缀进行标记。例如:1.2-SNAPSHOT、1.3-SNAPSHOT

下面是一个示例场景,说明开发人员的工作是如何因这种体系结构而受损的

假设有两个Maven项目:FooCore和FooWebApp,都是1.2-SNAPSHOT版本

  • 开发人员A正在开发FooCore,做了一些更改并编译了它
  • 开发者A继续工作,但在FooWebApp上
  • 开发人员B开始工作并更改foo核心。它提交他的工作并将其推送到SCM
  • Hudson由单片机触发;构建foo core并将其部署到Nexus中的快照存储库中
  • 开发者A正在foo webapp上运行
    mvn安装
    。Maven正在检查Nexus,发现Nexus中有一个更新版本的foo core。它下载它(充满了开发人员B的更改),但编译失败,因为开发人员A所做的更改不在本地存储库中的jar中。下载会覆盖由开发人员A安装的文件
现有解决方案

我查看了maven deploy插件,但该插件部署了与项目相关的所有工件。如果他们有办法配置要部署的工件,那就太好了


问题:有没有办法解决这个问题而不用基于maven deploy plugin编写自己的deploy插件?

我从未听说过这种可能性,如果可能的话,我也会非常惊讶。由于pom和生成的工件是某种类型的单元,所以(对我来说)只部署它们的一部分是没有意义的

不过,您应该考虑制定一个单独的POM项目,它指定您可能要在您的jar /战争项目中使用的依赖项和插件:

<groupId>foo.bar</groupId>
<artifactId>my-pom</artifactId>
<version>1.0.0</version>
<packaging>pom</packaging>
<parent>
    <groupId>foo.bar</groupId>
    <artifactId>my-pom</artifactId>
    <version>1.0.0</version>
</parent>

我从未试过,但发现了这个。尽管如此,我还是会尝试一下(因为这个问题还没有被评论)。

基本上是针对
-Dfile
参数,而不是工件,传递
pom.xml
,但仅仅这样做是不够的。您还需要提供项目的参数
-DgroupId
-DartifactId
。运行命令,耶<代码>mvn部署现在不会给您带来任何问题。下面是一个示例部署命令:

$ mvn deploy:deploy-file -DpomFile=pom.xml -Dfile=./pom.xml -DgroupId=my.group.id -DartifactId=artifact-id -DrepositoryId=bigdata-upload-snapshots -Durl=http://maven.mymaven.com/content/repositories/snapshots/

这样做的一个先决条件是在您的设置中添加存储库。xml不完全是这些人想要的答案。我的情况是我只想部署父pom。我在子模块中使用了
spring boot精简布局
。这需要将父模块部署到artifactory中。我在我的项目中添加了以下内容。它允许跳过
安装
和/或
部署
阶段

在我的父母pom中:

<properties>
    <disable.install>true</disable.install>
    <disable.deploy>true</disable.deploy>
    <enable.deployAtEnd>true</enable.deployAtEnd>
</properties>

<profiles>
    <profile>
        <id>deploy-parent</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <properties>
            <disable.install>true</disable.install>
            <disable.deploy>true</disable.deploy>
            <deployAtEnd>${enable.deployAtEnd}</deployAtEnd>
        </properties>
        <build>
            <finalName>${project.version}</finalName>
        </build>
    </profile>
</profiles>

真的
真的
真的
部署父级
真的
真的
真的
${enable.deployAtEnd}
${project.version}
以及“我的孩子pom”或任何您不希望与家长一起部署的模块中的:

<properties>
    <maven.install.skip>${disable.install}</maven.install.skip>
    <maven.deploy.skip>${disable.deploy}</maven.deploy.skip>
    <deployAtEnd>${enable.deployAtEnd}</deployAtEnd>
</properties>

${disable.install}
${disable.deploy}
${enable.deployAtEnd}

因此,当我在父pom上运行
mvn deploy
时,它将编译所有模块,而不是在任何东西上运行install,然后在最后部署任何没有“的模块。这只适用于部署pom文件(例如,在现有jar旁边):
注意:您还需要指定打包,否则它将作为
.xml
文件上载,而这不是您想要的。)


我已经编辑了我的问题,并添加了请求的动机,以便更好地澄清我的问题。我同意@FrVaBe,我不认为你的问题可以解决,我也不认为这是解决你的问题的最好办法。
-nsu
-o
(脱机)标志对于开发人员A避免该问题非常有用。但是,如果开发人员A是从多模块项目的顶层构建代码,则不必这样做,因为他的本地版本的foo core将优先于Hudson部署的新版本。最后,默认情况下,Maven每24小时只查找一次快照更新,因此这种情况在每个环境中每天最多发生一次;这些将从pom中推断。
<properties>
    <maven.install.skip>${disable.install}</maven.install.skip>
    <maven.deploy.skip>${disable.deploy}</maven.deploy.skip>
    <deployAtEnd>${enable.deployAtEnd}</deployAtEnd>
</properties>
mvn deploy:deploy-file \
-Dfile=pom.xml \
-Dpackaging=pom \
-DgroupId=com.mycompany.package \
-DartifactId=my-artifact \
-Dversion=2.0.1 \
-DrepositoryId=serverIdFromSettingsXMLForCredentials \
-Durl=http://repositoryserver/myrepo/