4

I need to make a small program that downloads maven projects and prints its dependencies

something like this:

MavenArtifactRepository repository = new MavenArtifactRepository("typesafe", "http://repo.typesafe.com/typesafe/releases/", ..., ..., ...);
downloadAndPrintDependencies(repository, "org.hsqldb", "hsqldb", "2.2.9");

void downloadAndPrintDependencies(repository, groupId, artifactId, version) {
  MavenProject projectDescription = new MavenProject("org.hsqldb", "hsqldb", "2.2.9");
  Artifact artifact = repository.getProject(projectDescription);  // this would download the artificat in the local repository if necessary

  List<Dependency> dependecies = artifact.getDependencies();
  ...
}

and, that can execute goals on a maven project, something like this:

String pomXmlFile = "/tmp/myproject/pom.xml";
Reader reader = new FileReader(pomXmlFile);
MavenXpp3Reader xpp3Reader = new MavenXpp3Reader();
Model model = xpp3Reader.read(reader);

ProjectArtifact projectArtifact = new ProjectArtifact(model);
projectArtifact.clean();
projectArtifact.install();

any feedback on the pseudo-code?

What is the correct class and function that fetches an artifact from the repository?

what is the correct class and function that executes goals (such as clean and install) on maven projects?

4

3 回答 3

4

好的

我有一个项目,Naether,它是 Maven 的依赖解析库 Aether 的包装器。

使用 Naether,您可以解决依赖关系

import com.tobedevoured.naether.api.Naether;
import com.tobedevoured.naether.impl.NaetherImpl;

Naether naether = new NaetherImpl();
naether.addDependency( "ch.qos.logback:logback-classic:jar:0.9.29" );
naether.addDependency( "junit:junit:jar:4.8.2" );
naether.resolveDependencies();
System.out.println( naether.getDependenciesNotation().toString() );

将输出:

["ch.qos.logback:logback-core:jar:0.9.29",
 "ch.qos.logback:logback-classic:jar:0.9.29",
 "junit:junit:jar:4.8.2",
 "org.slf4j:slf4j-api:jar:1.6.1" ]

坏的

我不知道如何通过 Java 构建(例如编译源代码)pom.xml。我搜索了一下,但没有找到具体的例子。ProjectArtifact只是 Maven 用来解析 POM 的工件描述符,例如父 POM 。它不公开构建操作。由于构建 Maven 项目的方法有上百万种,因此没有简单的安装方法。您必须以某种方式开始安装过程的生命周期。

Naether 可以做什么,首先构建项目并让Naether 安装它:

import com.tobedevoured.naether.api.Naether;
import com.tobedevoured.naether.impl.NaetherImpl;

Naether naether = new NaetherImpl();
naether.install( "com.example:sample:0.0.1", "/tmp/myproject/pom.xml", "/tmp/myproject/target/sample-0.0.1.jar" )

更新 - 这一切是如何结合在一起的?

构建、部署、安装等项目很复杂。Maven 在简化它方面做得很好。即使 Maven 任务只是install,它也需要执行许多步骤。对于一个简单的 Java 项目,这意味着填充类路径、编译源、打包 jar,然后将其安装在本地 Maven 存储库中。当您谈论打包 Java 项目的其他方法时,事情只会变得更加复杂,例如war

Maven 的人们做了艰苦的工作并将依赖解析分离到它自己的库Aether中。这完成了使用工件的所有繁重工作。Aether 可让您弄清楚项目的依赖项是什么,下载依赖项。Aether 还允许您在本地安装工件或将其部署到远程存储库。

Aether 不做的是管理项目。它不会清理目标目录或编译源。

我用 Naether 创建的只是访问 Aether 的一种简化方式。

于 2013-04-18T14:26:18.780 回答
1

看看jcabi-aether(我是一名开发人员)。您将能够解决任意 Maven 工件的传递依赖关系。

于 2013-05-21T10:35:47.280 回答
1

有些人建议使用Aether这里有例子

于 2013-04-18T14:26:22.977 回答