[英]How to get path to dependency jar with maven
Given a simple Maven project with for example JUnit as dependency, how do I get the full filepath to the junit.jar
inside the local maven repository it will be installed into?!给定一个简单的 Maven 项目,例如 JUnit 作为依赖项,我如何获得它要安装到的本地 Maven 存储库中
junit.jar
的完整文件路径?!
eg How to get from artifact junit:junit
to /Users/foobar/.m2/repository/junit/junit/4.11/junit-4.11.jar
?例如,如何从工件
junit:junit
到/Users/foobar/.m2/repository/junit/junit/4.11/junit-4.11.jar
?
The maven dependency plugin has a goal 'properties'. maven 依赖插件有一个目标“属性”。 From documentation :
从文档:
Goal that sets a property pointing to the artifact file for each project dependency.
为每个项目依赖项设置指向工件文件的属性的目标。 For each dependency (direct and transitive) a project property will be set which follows the groupId:artifactId:type:[classifier] form and contains the path to the resolved artifact.
对于每个依赖项(直接和传递),将设置一个项目属性,该属性遵循 groupId:artifactId:type:[classifier] 形式并包含解析工件的路径。
So something like this should do the trick:所以这样的事情应该可以解决问题:
<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>
Then the property ${junit:junit:jar}
should contain the jar file path那么属性
${junit:junit:jar}
应该包含 jar 文件路径
From the following SO answer , it looks like the easiest is to use the antrun plugin.从以下 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>
A hacky solution using mvn dependency:build-classpath
and some unix shell magic to extract the jar-path from the classpath.使用
mvn dependency:build-classpath
和一些 unix shell 魔法从类路径中提取 jar-path 的hacky 解决方案。
We have a pom.xml
like this...我们有一个像这样的
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>
Then we generate a build_classpath
file.然后我们生成一个
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
Now we can extract the jar file path from build_classpath
using some scripting foo...现在我们可以使用一些脚本 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
The path is build as $repository_dir/groupId/artifactId/version/artifactId-version.jar路径构建为 $repository_dir/groupId/artifactId/version/artifactId-version.jar
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
If you want to get the path inside your running code, you can do this:如果要获取运行代码中的路径,可以执行以下操作:
POM:聚甲醛:
<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>
Code:代码:
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.