我想将 Maven 或具有所有魔力的库嵌入到我的 Java 应用程序中。
要点:
他们是我想要执行的两项任务:
1/ 在本地存储库中
发布 jar 2/ 在私有企业存储库 (Nexus) 中发布 jar
所有必需的 jar 必须位于公共 Maven 存储库中
jar 应该与 Maven 版本无关(即不特定于 Maven 2 或 3)
如果可以,请提供您的回复的片段。
我正在尝试使用 maven 命令行部署一个 EXE 文件并将它的源文件压缩到 Sonatype Nexus。文件必须部署为快照。
所以,我有2个文件:
-testXYZ.exe and source file
-testXYZ.zip
Run Code Online (Sandbox Code Playgroud)
使用 maven 2.2.1 和此处描述的命令:
mvn deploy:deploy-file -Durl=file:///home/me/m2-repo \
-DrepositoryId=some.repo.id \
-Dfile=./path/to/artifact-name-1.0.jar \
-DpomFile=./path/to/pom.xml \
-Dsources=./path/to/artifact-name-1.0-sources.jar \
-Djavadoc=./path/to/artifact-name-1.0-javadoc.jar
Run Code Online (Sandbox Code Playgroud)
我可以部署EXE,但不能部署源代码,因为maven 2.2.1使用的是deploy-plugin v2.5,这个命令直到v2.7才被支持。我不允许使用较新版本的 maven,所以我尝试了不同的方法。
使用这两个后续命令,我可以部署这两个工件,但是无法从 nexus 下载源代码。
call mvn deploy:deploy-file -DgroupId=com.xyz -DartifactId=testXYZ -Dversion=1.1.116-SNAPSHOT -Dpackaging=zip -Dfile=testXYZ.zip -Dclassifier=sources -Durl=http://build:8081/nexus/content/repositories/snapshots -DrepositoryId=nexus
call mvn deploy:deploy-file -DgroupId=com.xyz -DartifactId=testXYZ -Dversion=1.1.116-SNAPSHOT -Dpackaging=exe -Dfile=testXYZ.exe -Durl=http://build:8081/nexus/content/repositories/snapshots -DrepositoryId=nexus
Run Code Online (Sandbox Code Playgroud)
部署后,我搜索 testXYZ 并单击工件源下载链接。Nexus 说:
“在路径“com.xyz:testXYZ:1.1.116-SNAPSHOT:c=sources:e=jar”上找不到项目!”
问题是 Maven 上传这些工件的方式:
Line form log file while source is uploading:
Uploaded: http://build:8081/nexus/content/repositories/snapshots/com/xyz/testXYZ/1.1.116-SNAPSHOT/testXYZ-1.1.116-20120106.111705-1-sources.zip
Line form log file …Run Code Online (Sandbox Code Playgroud) 我想在Nexus中已发布的版本中添加两个zip。
从本质上讲,它们是该应用程序的压缩演示,也是该应用程序的扩展版本。
使用Deploy插件,我在pom中定义了两个执行,每个文件一个,并将它们绑定到部署阶段。这是演示的一个:
<execution>
<id>deploy-essential</id>
<phase>deploy</phase>
<goals>
<goal>deploy-file</goal>
</goals>
<configuration>
<file>${project.build.directory}/${project.artifactId}-${project.version}-demo.zip</file>
<groupId>${project.groupId}</groupId>
<artifactId>myproject</artifactId>
<version>${project.version}</version>
<classifier>demo</classifier>
<repositoryId>nexus</repositoryId>
<url>${targetrepository}</url>
<generatePom>false</generatePom>
</configuration>
</execution>
Run Code Online (Sandbox Code Playgroud)
我希望Maven在执行此命令时上传文件并将元数据更新为给定的G / A / V坐标。但是,相反,它会将给定文件及其包含完整版本的姊妹文件上载到给定坐标,然后将它们两者再次上载到其原始坐标。
然后继续为第二次执行再次执行所有这些操作。这是我的日志摘录:
[INFO] --- maven-deploy-plugin:2.7:deploy-file (deploy-demo) @ bundle ---
Downloading: http://nexus/repositories/snapshots/mygroup/myproject/1.2.6-SNAPSHOT/maven-metadata.xml
2 KB
Downloaded: http://nexus/repositories/snapshots/mygroup/myproject/1.2.6-SNAPSHOT/maven-metadata.xml (2 KB at 4.8 KB/sec)
Uploading: http://nexus/repositories/snapshots/mygroup/myproject/1.2.6-SNAPSHOT/myproject-1.2.6-20121130.102624-5-demo.zip
...
Uploaded: http://nexus/repositories/snapshots/mygroup/myproject/1.2.6-SNAPSHOT/myproject-1.2.6-20121130.102624-5-demo.zip (13032 KB at 23105.2 KB/sec)
Downloading: http://nexus/repositories/snapshots/mygroup/myproject/maven-metadata.xml
533 B
Downloaded: http://nexus/repositories/snapshots/mygroup/myproject/maven-metadata.xml (533 B at 34.7 KB/sec)
Uploading: http://nexus/repositories/snapshots/mygroup/myproject/1.2.6-SNAPSHOT/maven-metadata.xml
2 KB
Uploaded: http://nexus/repositories/snapshots/mygroup/myproject/1.2.6-SNAPSHOT/maven-metadata.xml (2 KB at 89.4 KB/sec) …Run Code Online (Sandbox Code Playgroud) 根据手册,在 Maven 3 中,我们被迫使用uniqueSnapshots=true. 这意味着每个部署1.0-SNAPSHOT实际上都由一些唯一的、规范的 ID 支持,例如1.0-20080207-230803-1.
因此,调用mvn deploy会产生在mvn调用可执行文件之前无法确定规范版本的工件。
因此,如果希望对之后生成的唯一 ID 调用任何操作,则必须尝试在mvn deploy完成后从 Maven 可执行文件中提取生成的 ID 。
有没有这样的机制来获取唯一ID?
例如,mvn deploy将产生以下输出:
Uploading: https://oss.sonatype.org/content/repositories/snapshots/io/airlift/slice/0.11-SNAPSHOT/slice-0.11-20150220.165404-2.jar
Run Code Online (Sandbox Code Playgroud)
但是如果0.11-20150220.165404-2不解析 Maven 的输出,似乎没有办法访问 ID 。
示例场景: mvn build 导致一个新的(唯一的)工件被推送到内部存储库管理器。完成后,我们希望通过 HTTP 推送通知以通知某个远程应用程序新的 SNAPSHOT 版本的应用程序。
虽然我们的资源库管理使我们能够查询最新的快照版本,这是不一样的能够通过周围绝对引用到特定版本。
这是我在pom.xml中的条目:
<pluginRepositories>
<pluginRepository>
<id>synergian-repo</id>
<url>https://raw.github.com/synergian/wagon-git/releases</url>
</pluginRepository>
</pluginRepositories>
...
<distributionManagement>
<repository>
<id>my id</id>
<name>my repo name</name>
<url>my repo url</url>
</repository>
</distributionManagement>
...
<build>
<extensions>
<extension>
<groupId>ar.com.synergian</groupId>
<artifactId>wagon-git</artifactId>
<version>0.2.5</version>
</extension>
....
</build>
Run Code Online (Sandbox Code Playgroud)
我在做什么:
mvn clean package (创建快照版本)mvn release:prepare (创建新的发行版本,并将该jar和标签适当地上传到我的git存储库中)mvn release:perform -通过这一步骤,我希望将第2步创建的新发行版本上载到包含所有发行jar的存储库中。相反,mvn release:perform会创建一个新的快照版本,并将该快照jar上传到releases存储库。
问题是:我如何设法将非快照发布jar上载到存储库,而不是始终创建和上载新快照版本?
我想念什么?
我正在使用 Maven 来构建一个特定的项目,并且在 POM 中,我正在使用 maven shade 插件构建主要工件的 3 个不同变体(我正在创建具有各种包含日志框架组合的 uber jar)。阴影插件使用替代工件 ID 及其各自的依赖减少的 poms 创建 jar。
我现在面临的挑战是如何将这些新工件部署到我的远程存储库。我正在使用 maven install 插件将它们安装到我的本地 repo,但是 maven deploy 插件需要显式配置存储库 URL。我想要发生的是插件采用默认部署使用的任何远程存储库,无论是快照或发布存储库还是我通过命令行传入的另一个存储库 URL。我希望找到一些像 ${project.remoterepo.url} 这样的 maven 属性,它等同于已解决的 repo。当部署目标已经这样做时,必须显式配置远程 URL 似乎很愚蠢。
任何建议表示赞赏。谢谢!
运行命令时
mvn -X clean deploy
Run Code Online (Sandbox Code Playgroud)
我收到以下错误
[INFO] --- maven-deploy-plugin:2.7:deploy (default-deploy) @ something ---
[DEBUG] [buildinfo] Resolved artifact: org.apache.maven.plugins:maven-deploy-plugin:pom:2.7:build from: team (http://myrepo/maven/m2repos, releases+snapshots) Context is: plugin
[DEBUG] [buildinfo] Resolved artifact: org.apache.maven.plugins:maven-deploy-plugin:jar:2.7:build from: team (http://myrepo/maven/m2repos, releases+snapshots) Context is: plugin
[DEBUG] [buildinfo] Resolved artifact: junit:junit:jar:3.8.1:build from: C:\Users\user\.m2\repository (enhanced) Context is: plugin
[DEBUG] [buildinfo] Resolved artifact: org.codehaus.plexus:plexus-utils:jar:1.5.6:build from: C:\Users\user\.m2\repository (enhanced) Context is: plugin
[INFO] Uploading: scp://myrepo/export/maven/m2repos/com/team/myproject/10.8/myproject-10.8.war
[INFO] Uploaded: scp://myrepo/export/maven/m2repos/com/team/myproject/10.8/myproject-10.8.war (162384 KB at 23020.0 KB/sec)
[INFO] Uploading: scp://myrepo/export/maven/m2repos/com/team/myproject/10.8/myproject-10.8.pom
[INFO] Uploaded: scp://myrepo/export/maven/m2repos/com/team/myproject/10.8/myproject-10.8.pom (46 KB at 27.3 …Run Code Online (Sandbox Code Playgroud) 生成校验和的功能似乎已从安装插件转移到部署插件(请参阅MDEPLOY-231)。似乎不再有参数来控制校验和的生成和部署,无论是在安装插件 3.0.0-M1中(“createChecksum”参数显然不再存在),还是在部署插件 3.0.0-中M1。
我假设现在默认情况下会激活校验和(请参阅此博客文章),但最终我的本地存储库和 Artifactory 中都没有任何校验和,并且我在日志中看不到任何与校验和相关的内容(运行 mvn deploy)。
这应该不重要,但也许是:我使用的是 https 传输,而不是 ssh。
这里是日志摘录:
[INFO] --- maven-install-plugin:3.0.0-M1:install (default-install) @ base-module ---
[INFO] Installing C:\data\src\s-libs\base\target\base-module-0.2.5-SNAPSHOT.jar to (...)
[INFO] Installing C:\data\src\s-libs\base\pom.xml to (...)
[INFO] Installing C:\data\src\s-libs\base\target\base-module-0.2.5-SNAPSHOT-sources.jar to (...)
[INFO]
[INFO] --- maven-deploy-plugin:3.0.0-M1:deploy (default-deploy) @ base-module ---
Downloading (...)
Uploading to psys_mvn: https://psys.ex1.de/artifactory/psys_mvn/de/ex1/psys/base-module/0.2.5-SNAPSHOT/base-module-0.2.5-20200311.190843-3.jar
(...)
Uploading to psys_mvn: https://psys.ex1.de/artifactory/psys_mvn/de/ex1/psys/base-module/0.2.5-SNAPSHOT/base-module-0.2.5-20200311.190843-3.pom
(...)
Uploading to psys_mvn: https://psys.ex1.de/artifactory/psys_mvn/de/ex1/psys/base-module/0.2.5-SNAPSHOT/base-module-0.2.5-20200311.190843-3-sources.jar
(...)
Uploading to psys_mvn: https://psys.ex1.de/artifactory/psys_mvn/de/ex1/psys/base-module/0.2.5-SNAPSHOT/maven-metadata.xml
(...)
Uploading to psys_mvn: https://psys.ex1.de/artifactory/psys_mvn/de/ex1/psys/base-module/maven-metadata.xml
(...)
Run Code Online (Sandbox Code Playgroud) 我像这样调用 deploy-file 将一些 JAR 加载到我的公司存储库中:
mvn org.apache.maven.plugins:maven-deploy-plugin:2.8.2:deploy-file \
-Dfile=lib/SomeLib.jar \
-DrepositoryId=mycompany-central \
-Durl=http://myserver/artifactory/libs-release-local -DgeneratePom=false \
-DgroupId=com.some.lib \
-DartifactId=SomeLib \
-Dversion=1.2.5.3
Run Code Online (Sandbox Code Playgroud)
我设置generatePom到false,我想生成或改变尽可能少的假设下。我正在加载的库碰巧是使用 maven 构建的,并且在META-INF.
问题:一般在什么情况下应该generatePom设置为false?在我的情况下应该generatePom设置为false?
maven-release-plugin如果有单元测试失败,我很长时间不会发布(也就是将jar部署到maven repo).
出于各种原因,我想只使用maven部署插件,但显然即使在测试失败的情况下仍会部署maven-surefire-plugin.
因此而不仅仅是
mvn clean deploy
Run Code Online (Sandbox Code Playgroud)
我必须设置我的CI与(shell)做两步:
mvn clean test && mvn deploy -DskipTests=true
Run Code Online (Sandbox Code Playgroud)
我已经确定肯定没有设置忽略失败.理想情况下,我不想运行两个单独的进程.
当然,测试失败的部署不能是默认的吗?我错过了什么吗?
编辑它似乎是詹金斯问题..无法重现
我不确定Jenkins为什么或如何强制maven构建继续测试失败(我假设这是用于报告)但它没有显示任何传递给它的选项以继续.它似乎只发生在詹金斯说"模块改变,重新计算依赖图"时.
maven ×9
java ×3
build ×1
checksum ×1
deployment ×1
jenkins ×1
maven-2 ×1
maven-3 ×1
maven-plugin ×1
nexus ×1