我目前正在编写一个Java程序,将大量遗留罐子部署到Nexus。我的方法是调用在命令行上启动deploy:deploy-file
目标的进程
mvn deploy:deploy-file ...
这很慢。我想知道是否有更快的方法来做到这一点?
答案 0 :(得分:8)
如果您专门针对Nexus,您可能会发现更简单地使用their REST API来执行上传:
以下是使用curl的一些示例。
上传工件并生成pom文件:
curl -v -F r=releases -F hasPom=false -F e=jar -F g=com.test -F a=project -F v=1.0 -F p=jar -F file=@project-1.0.jar -u admin:admin123 http://localhost:8081/nexus/service/local/artifact/maven/content
- 醇>
使用pom文件上传工件:
curl -v -F r=releases -F hasPom=true -F e=jar -F file=@pom.xml -F file=@project-1.0.jar -u admin:admin123 http://localhost:8081/nexus/service/local/artifact/maven/content
在Java程序中,您可以使用HttpURLConnection
进行POST调用(example of that here authentication here和documentation of cURL here)。基本上,在POST参数中,您需要r=releases
,hasPom=true
(或false
如果您正在上传POM),e
用于扩展工件,g
,a
,v
和p
用于坐标(groupId,artifactId,版本和打包),最后是file
用于要部署的文件。
请注意,您将无法上传快照because it is explicitely disabled。
如果你想要一个更通用的解决方案,那将适用于任何工件,对于任何远程存储库(甚至是本地存储库),你可以直接使用Aether API,它在Maven 3.1及更高版本的场景下使用。该团队在DeployArtifacts
示例中有一个这样的任务示例。
向您的项目添加Aether依赖项:
<dependencies>
<dependency>
<groupId>org.eclipse.aether</groupId>
<artifactId>aether-impl</artifactId>
<version>${aetherVersion}</version>
</dependency>
<dependency>
<groupId>org.eclipse.aether</groupId>
<artifactId>aether-connector-basic</artifactId>
<version>${aetherVersion}</version>
</dependency>
<dependency>
<groupId>org.eclipse.aether</groupId>
<artifactId>aether-transport-file</artifactId>
<version>${aetherVersion}</version>
</dependency>
<dependency>
<groupId>org.eclipse.aether</groupId>
<artifactId>aether-transport-http</artifactId>
<version>${aetherVersion}</version>
</dependency>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-aether-provider</artifactId>
<version>${mavenVersion}</version>
</dependency>
</dependencies>
<properties>
<aetherVersion>1.1.0</aetherVersion>
<mavenVersion>3.3.9</mavenVersion>
</properties>
然后您可以使用以下代码来部署工件:
public static void main(String[] args) throws DeploymentException {
RepositorySystem system = newRepositorySystem();
RepositorySystemSession session = newSession(system);
Artifact artifact = new DefaultArtifact("groupId", "artifactId", "classifier", "extension", "version");
artifact = artifact.setFile(new File("/path/to/file"));
// add authentication to connect to remove repository
Authentication authentication = new AuthenticationBuilder().addUsername("username").addPassword("password").build();
// creates a remote repo at the given URL to deploy to
RemoteRepository distRepo = new RemoteRepository.Builder("id", "default", "url").setAuthentication(authentication).build();
DeployRequest deployRequest = new DeployRequest();
deployRequest.addArtifact(artifact);
deployRequest.setRepository(distRepo);
system.deploy(session, deployRequest);
}
private static RepositorySystem newRepositorySystem() {
DefaultServiceLocator locator = MavenRepositorySystemUtils.newServiceLocator();
locator.addService(RepositoryConnectorFactory.class, BasicRepositoryConnectorFactory.class);
locator.addService(TransporterFactory.class, FileTransporterFactory.class);
locator.addService(TransporterFactory.class, HttpTransporterFactory.class);
return locator.getService(RepositorySystem.class);
}
private static RepositorySystemSession newSession(RepositorySystem system) {
DefaultRepositorySystemSession session = MavenRepositorySystemUtils.newSession();
LocalRepository localRepo = new LocalRepository("target/local-repo");
session.setLocalRepositoryManager(system.newLocalRepositoryManager(session, localRepo));
return session;
}
此代码将具有给定坐标(groupId,artifactId,type,classifier和version)的单个工件部署到配置的远程存储库:
""
作为分类器。setFile
上的方法Artifact
进行设置。"default"
布局是Maven 2存储库使用的布局(与Maven 1的"legacy"
布局相反)。该网址与您在deploy-file
goal中使用的网址相同,因此file:///C:/m2-repo
或scp://host.com/path/to/repo
。Authentication
以连接到远程存储库(如代码段所示)。如果您希望使用它来部署附加工件,例如POM文件,则可以使用以下内容创建SubArtifact
Artifact pomArtifact = new SubArtifact(artifact, "", "pom");
pomArtifact = pomArtifact.setFile(new File("pom.xml"));
这会将没有分类器的POM工件附加到上面配置的工件。然后,您可以将其添加到部署请求,如主要部分:
deployRequest.addArtifact(artifact).addArtifact(pomArtifact);
并将部署它们。
答案 1 :(得分:3)
您可以使用Eclipse Aether API以Java编程方式执行此操作。查看我的Maven Repository Tools的来源以获取更多详细信息。实际上,如果所有工件都已经存在于Maven存储库格式的本地文件夹中,您可以直接使用它来满足您的需求。
具体而言,部署相关代码位于
中