簡體   English   中英

如何使用maven獲取依賴jar的路徑

[英]How to get path to dependency jar with maven

給定一個簡單的 Maven 項目,例如 JUnit 作為依賴項,我如何獲得它要安裝到的本地 Maven 存儲庫中junit.jar的完整文件路徑?!

例如,如何從工件junit:junit/Users/foobar/.m2/repository/junit/junit/4.11/junit-4.11.jar

maven 依賴插件有一個目標“屬性”。 文檔

為每個項目依賴項設置指向工件文件的屬性的目標。 對於每個依賴項(直接和傳遞),將設置一個項目屬性,該屬性遵循 groupId:artifactId:type:[classifier] 形式並包含解析工件的路徑。

所以這樣的事情應該可以解決問題:

<properties>
    <maven-dependency-plugin.version>3.1.1</maven-dependency-plugin.version>
</properties>
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <version>${maven-dependency-plugin.version}</version>
    <executions>
        <execution>
            <phase>initialize</phase>
            <goals>
                <goal>properties</goal>
            </goals>
        </execution>
    </executions>
</plugin>

那么屬性${junit:junit:jar}應該包含 jar 文件路徑

以下 SO answer來看,最簡單的方法是使用 antrun 插件。

<plugin>
    <artifactId>maven-antrun-plugin</artifactId>
    <executions>
        <execution>
            <phase>process-resources</phase>
            <configuration>
                <tasks>
                    <echo>${maven.dependency.junit.junit.jar.path}</echo>
                </tasks>
            </configuration>
            <goals>
                <goal>run</goal>
            </goals>
        </execution>
    </executions>
</plugin>

使用mvn dependency:build-classpath和一些 unix shell 魔法從類路徑中提取 jar-path 的hacky 解決方案

我們有一個像這樣的pom.xml ......

<?xml version="1.0" encoding="UTF-8"?>
<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.mycompany</groupId>
  <artifactId>myproject</artifactId>
  <version>1.0-SNAPSHOT</version>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>

然后我們生成一個build_classpath文件。

$ mvn dependency:build-classpath -Dmdep.outputFile=build_classpath
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building myproject 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-dependency-plugin:2.8:build-classpath (default-cli) @ myproject ---
[INFO] Wrote classpath file '/Users/foobar/maven-test/build_classpath'.
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.050 s
[INFO] Finished at: 2015-01-23T09:17:40+01:00
[INFO] Final Memory: 11M/245M
[INFO] ------------------------------------------------------------------------
$ cat build_classpath
/Users/foobar/.m2/repository/junit/junit/4.11/junit-4.11.jar:/Users/foobar/.m2/repository/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar

現在我們可以使用一些腳本 foo... 從build_classpath提取 jar 文件路徑。

$ cat build_classpath | perl -ne 'print "$1" if /(?:^|:)([^:]+?\/junit-[0-9\.]+\.jar)/'
/Users/foobar/.m2/repository/junit/junit/4.11/junit-4.11.jar

路徑構建為 $repository_dir/groupId/artifactId/version/artifactId-version.jar

<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>

如果要獲取運行代碼中的路徑,可以執行以下操作:

聚甲醛:

    <dependency>
        <groupId>com.github.nodyn</groupId>
        <artifactId>jvm-npm</artifactId>
        <version>a0c3f12</version>
    </dependency>
    <dependency>
        <groupId>org.eclipse.aether</groupId>
        <artifactId>aether-impl</artifactId>
        <version>1.1.0</version>
    </dependency>
            <dependency>
        <groupId>org.eclipse.aether</groupId>
        <artifactId>aether-transport-file</artifactId>
        <version>1.1.0</version>
    </dependency>
    <dependency>
        <groupId>org.eclipse.aether</groupId>
        <artifactId>aether-connector-basic</artifactId>
        <version>1.1.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.maven</groupId>
        <artifactId>maven-aether-provider</artifactId>
        <version>3.1.0</version>
    </dependency>

代碼:

final String mavenRepositoryPath = "c:\\mvn\\repository";

private static RepositorySystem newRepositorySystem() {
    DefaultServiceLocator locator = MavenRepositorySystemUtils.newServiceLocator();
    locator.addService(RepositoryConnectorFactory.class, BasicRepositoryConnectorFactory.class);
    locator.addService(TransporterFactory.class, FileTransporterFactory.class);

    locator.setErrorHandler(new DefaultServiceLocator.ErrorHandler() {
        @Override
        public void serviceCreationFailed(Class<?> type, Class<?> impl, Throwable exception) {
            throw new RuntimeException(exception);
        }
    });

    return locator.getService(RepositorySystem.class);
}

private static File getJvmNpmFile() {
    Artifact artifact = new DefaultArtifact("com.github.nodyn:jvm-npm:a0c3f12");

    DefaultRepositorySystemSession session = new org.eclipse.aether.DefaultRepositorySystemSession();
    RepositorySystem system = newRepositorySystem();
    ArtifactRequest request = new ArtifactRequest();
    request.setArtifact(artifact);
    //request.setRepositories(new ArrayList<>( Arrays.asList( new RemoteRepository.Builder( "central", "default", "http://central.maven.org/maven2/" ).build()) ));
    //request.setRepositories( new org.eclipse.aether.DefaultRepositorySystemSession().getLocalRepository() );
    LocalRepository localRepo = new LocalRepository(mvnRepositoryPath);
    session.setLocalRepositoryManager(system.newLocalRepositoryManager(session, localRepo));

    ArtifactResult result;
    try {
        result = system.resolveArtifact(session, request);
    } catch (ArtifactResolutionException ex) {
        throw new RuntimeException(ex);
    }

    //System.out.println("Resolved artifact " + artifact + " to " + result.getArtifact().getFile() + " from " + result.getRepository());
    return result.getArtifact().getFile();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM