Apache项目log4cxx是在C++中实现的,但由于历史原因,它使用Maven来管理网站和其他内容。一些单元测试甚至需要Java,例如log4j
,并且至少在pom.xml
中对依赖关系进行建模,如下所示:
<dependencies>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.14</version>
<scope>test</scope>
</dependency>
这样做的好处是,在构建网站时会自动生成包含该依赖项的页面。这种方法的糟糕之处在于,它读起来很像是所有必需的依赖项,但事实并非如此。还有一些额外的工具需要成功构建,如APR
,以及一些成功运行测试所必需的shell工具(如sed
(。如果能够使用已经可用的插件来维护这些依赖关系,那就太好了。
出于测试目的,我提出了以下内容:
<dependency>
<groupId>apr</groupId>
<artifactId>util</artifactId>
<version>1.5.4</version>
<scope>system</scope>
<systemPath>${user.home}/Documents/Svn/Src/Libs/trunk/C/X-OS/APR/apr-util/1.5.4/build/RAD 10.2/libs/libapr-util/Win32/Debug/out/libapr-util.lib</systemPath>
<type>lib</type>
</dependency>
这为页面添加了一个额外的依赖项,让构建最终成功,但仍然在shell上打印以下错误消息:
[ERROR] Artifact: apr:util:lib:1.5.4 has no file.
这很有趣,因为使用ProcMon,我可以看到配置的文件被访问了,而且我根本看不到任何其他APR命名的文件被请求。
13:57:58,5662686 java.exe 8312 CloseFile C:UserstschoeningDocumentsSvnSrcLibstrunkCX-OSAPRapr-util1.5.4buildRAD 10.2libslibapr-utilWin32Debugoutlibapr-util.lib SUCCESS
此外,这似乎只在使用作用域system
的情况下有效,而我想将例如sed
建模为作用域test
所必需的。system
也被证明是不赞成使用的。
那么,有没有办法以Maven只使用它们来创建相应页面的方式对额外的依赖项进行建模如果可以告诉Maven根本不解决一些依赖关系,但使用provided
或除上述system
之外的任何其他方法都没有成功,那就太好了。
谢谢!
要使事情变得完整,最简单的方法似乎是使用项目本地Maven repo来建模依赖关系。只需向pom.xml
:添加一些回购和感兴趣的依赖项
<repositories>
<!-- Apache APR -->
<repository>
<id>mvn_tmatesoft_com</id>
<name>maven.tmatesoft.com</name>
<url>https://maven.tmatesoft.com/content/repositories/releases</url>
</repository>
<!-- Local repos to model non-public dependencies for different purposes. -->
<repository>
<id>log4cxx_non_public_deps</id>
<url>file:///${project.basedir}/src/mvn_repo</url>
</repository>
</repositories>
重要的是${project.basedir}
支持在任何部署中放置项目的任何路径。可以根据需要添加依赖项:
<dependencies>
<dependency>
<groupId>org.apache.apr</groupId>
<artifactId>apr</artifactId>
<version>1.5.2</version>
<scope>compile</scope>
<type>pom</type>
</dependency>
<dependency>
<groupId>org.apache.apr</groupId>
<artifactId>apr-util</artifactId>
<version>1.5.4</version>
<scope>compile</scope>
<type>pom</type>
</dependency>
<dependency>
<groupId>org.apache.logging.log4cxx.deps</groupId>
<artifactId>gzip</artifactId>
<version>1.10.0</version>
<scope>runtime</scope>
<type>pom</type>
</dependency>
<dependency>
<groupId>org.apache.logging.log4cxx.deps</groupId>
<artifactId>sed</artifactId>
<version>4.8.0</version>
<scope>test</scope>
<type>pom</type>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.14</version>
<scope>test</scope>
</dependency>
</dependencies>
因为非公共依赖关系由本地回购来满足,所以在理论上可以自由命名组和类似的东西。最后一个重要步骤是在正确的目录中实际提供依赖项:
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<groupId>org.apache.logging.log4cxx.deps</groupId>
<artifactId>gzip</artifactId>
<version>1.10.0</version>
<packaging>zip</packaging>
</project>
src/mvn_repo/org/apache/logging/log4cxx/deps/gzip/1.10.0/gzip-10.0.pom
所有这些依赖项都被Maven依赖插件使用。
https://github.com/apache/logging-log4cxx/pull/35https://github.com/apache/logging-log4cxx/pull/35/commits/2a5c157896b26c4c6445b1644de8266d3d0b54b1