Maven + Kotlin/Java - 以编程方式从本地 Maven 存储库获取 jar 文件

问题描述 投票:0回答:1

我想在测试运行时读取位于 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")

但它什么也没得到,因为默认情况下它会查找应用程序类路径目录。

java kotlin maven jvm
1个回答
0
投票

您可以使用 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.");
            }
        }
    }

希望对你有帮助:)

© www.soinside.com 2019 - 2024. All rights reserved.