我有一个maven
项目。
在该项目中,我有一个携带 jar 的 .zip依赖项,我需要将该 jar 从 zip 依赖项中提取出来,并让 maven 将该 jar 用作依赖项。我目前可以下载和解压缩zip,但无法找到在构建过程中将解压缩的jar添加为项目依赖项的方法。
这是我目前正在做的拆包工作:
<dependency>
<groupId>com.bar</groupId>
<artifactId>foo</artifactId>
<version>${foo.version}</version>
<type>zip</type>
</dependency>
...
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>unpack</id>
<goals>
<goal>unpack-dependencies</goal>
</goals>
<phase>validate</phase>
<configuration>
<includeGroupIds>com.bar</includeGroupIds>
<includeArtifactIds>foo</includeArtifactIds>
<outputDirectory>${basedir}/target</outputDirectory>
<type>jar</type>
</configuration>
</execution>
</executions>
</plugin>
我读过其他一些帖子,您可以尝试使用它将 jar 添加到类路径中。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<additionalClasspathElements>
<additionalClasspathElement>${basedir}/target</additionalClasspathElement>
</additionalClasspathElements>
</configuration>
</plugin>
即使这样做,我仍然无法在我的项目中引用 foo.jar 中的包。
有人可以帮助我吗?
为了让 maven 在不巧妙地破坏其他地方的东西的情况下使用它,您必须将 jar 安装到本地存储库中。
我认为在 target/中解压缩 zip 文件然后在生成的 jar 上调用 install:install-file 的组合可以满足您的需求。 几年前我问过如何将其集成到普通构建中 - 您可能会发现答案相关。多个安装:在单个pom中安装文件.xml
解压缩 zip 后,模块的目标文件夹中有 foo.jar:${project.build.directory}/foo.jar
完成此操作后,您可以声明指向该jar的系统依赖项,例如
<dependency>
<groupId>foo</groupId>
<artifactId>foo.jar</artifactId>
<systemPath>${project.build.directory}/foo.jar</systemPath>
</dependency>
提示:如果您不想在每次进行清理时都删除/重新下载 jar(某些 IDE 会抱怨 jar 并不总是存在(,只需在 ${project.basedir}
中下载一次即可。
要下载一次 jar,您可以将"解压缩"执行放在一个配置文件中,该配置文件仅在缺少 jar 时激活。
<profiles>
<profile>
<activation>
<file>
<missing>${project.basedir}/foo.jar</missing>
</file>
</activation>
...
</profile>
</profiles>
前段时间,我遇到了同样的问题。我有一个 zip 文件作为我的依赖项,在构建过程中我需要提取它并将我生成的包中的内容分开。
我不知道你用什么来交付你的项目,但当时我已经使用了maven-antrun-plugin
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>2.6</version>
</plugin>
有了这个,我在target
配置中使用了标签unzip
。正如你在这里或这里看到的。我只是不建议您像他们正在使用的那样使用 task
标签,您最好更喜欢 target
标签。
希望对您有所帮助。