我想在测试运行时读取位于 Maven 本地存储库中的任何 jar 文件。 例如,以下代码将起作用并读取 jar 文件:
File("/Users/myusername/.m2/repository/log4j/log4j/1.2.17/log4j-1.2.17.jar")
当我从“java.class.path”属性获取值时,我可以看到 jar 文件的路径位于类路径列表中:
System.getProperty("java.class.path")
输出:
...:/Users/myusername/.m2/repository/io/netty/netty-transport-classes-epoll/4.1.87.Final/netty-transport-classes-epoll-4.1.87.Final.jar:/Users/myusername/.m2/repository/log4j/log4j/1.2.17/log4j-1.2.17.jar
但是我无法理解如何在不指定 jar 文件的完整路径的情况下获取相同的文件。我的目标是编写可以在任何带有 Maven 的机器上运行的代码。
我尝试仅使用文件名:
File("log4j-1.2.17.jar")
但它什么也没得到,因为默认情况下它会查找应用程序类路径目录。
您可以使用 Maven Dependency Resolver 库根据 JAR 文件的坐标(如组 ID、工件 ID 等)以编程方式解析 JAR 文件的路径。
尝试一下这个。它使用 Maven 依赖解析器库。它的范围广泛但有效。它还假设您的项目中有 Maven Dependency Resolver 依赖项,类路径中有 Aether 库:
import org.apache.maven.shared.dependency.tree.DependencyTreeBuilder;
import org.apache.maven.shared.dependency.tree.DependencyTreeBuilderException;
import org.apache.maven.shared.dependency.tree.DependencyTreeBuilderSession;
import org.apache.maven.shared.dependency.tree.DefaultDependencyTreeBuilder;
import org.apache.maven.shared.dependency.tree.DependencyNode;
import org.apache.maven.shared.dependency.tree.DependencyNodeVisitor;
import org.eclipse.aether.RepositorySystem;
import org.eclipse.aether.RepositorySystemSession;
import org.eclipse.aether.RepositorySystemSession;
import org.eclipse.aether.artifact.Artifact;
import org.eclipse.aether.artifact.DefaultArtifact;
import org.eclipse.aether.collection.CollectRequest;
import org.eclipse.aether.graph.Dependency;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
public class MavenLocalRepositoryReader {
public static File getJarFileFromMavenLocalRepo(String groupId, String artifactId, String version) {
RepositorySystem repoSystem = new DefaultRepositorySystem();
RepositorySystemSession repoSession = MavenRepositorySystemUtils.newSession();
Artifact artifact = new DefaultArtifact(groupId, artifactId, "jar", version);
CollectRequest collectRequest = new CollectRequest();
collectRequest.setRoot(new Dependency(artifact, ""));
DependencyTreeBuilder treeBuilder = new DefaultDependencyTreeBuilder();
try {
DependencyNode rootNode = treeBuilder.buildDependencyTree(repoSystem, repoSession, null, collectRequest);
List<File> jarFiles = new ArrayList<>();
DependencyNodeVisitor visitor = new DependencyNodeVisitor() {
@Override
public boolean visit(DependencyNode node) {
Artifact nodeArtifact = node.getArtifact();
if (nodeArtifact != null && "jar".equals(nodeArtifact.getExtension())) {
jarFiles.add(nodeArtifact.getFile());
}
return true;
}
@Override
public boolean endVisit(DependencyNode node) {
return true;
}
};
rootNode.accept(visitor);
if (!jarFiles.isEmpty()) {
return jarFiles.get(0); // Assuming there is only one JAR file for the given coordinates
}
} catch (DependencyTreeBuilderException e) {
e.printStackTrace();
}
return null;
}
public static void main(String[] args) {
// Example usage
String groupId = "log4j";
String artifactId = "log4j";
String version = "1.2.17";
File jarFile = getJarFileFromMavenLocalRepo(groupId, artifactId, version);
if (jarFile != null) {
System.out.println("Found JAR file: " + jarFile.getAbsolutePath());
} else {
System.out.println("JAR file not found in the Maven local repository.");
}
}
}
希望对你有帮助:)