我有一个新的图书馆,叫做代码网。这取决于我创建的另外两个库,即模板父权和XBN-Java。但是初级图书馆--我想让其他人使用的那个--是代码库。另外两个是次要的。两者都是必需的,但它们仅在需要高级功能时才直接使用。
我用Ant构建了所有这三个项目的所有方面。我使用Maven的原因只有一个:在罐子上签名
codelet-0.1.0.jarcodelet-0.1.0-sources.jarcodelet-0.1.0-javadoc.jar把它们推到Maven Central。在过去的一周里经历了大量的流血、汗水、眼泪和灵魂的脱落,这四个问题都证明了这一点。
我终于让这些jars通过mvn deploy上传到Maven Central,至少一次,所以这是一个很大的进步。
然而,我意识到,为了让其他人真正使用Codelet,他们需要在Codelet的POM中映射整个依赖树。我相信这是正确的。
我担心,在三个项目的依赖树中映射这个依赖树,本质上需要我在Maven中复制我的Ant构建过程。我希望我不需要这么做,因为Ant对我很好,Maven和我相处得不好。
下面是依赖树:
仅用于编译核心库类和示例代码的依赖项。
所有项目都由Maven groupId / artifactId / version__列出。
XBN-Java0.1.3依赖于
org.apache.commons / commons-collections4 / 4.0org.apache.commons / commons-io / 2.4org.apache.commons / commons-lang3 / 3.3.2com.google.guava / guava / 16.0模板FeatherWave0.1.0依赖于
com.github.aliteralmind / xbnjava / 0.1.3 (及其依赖项)代码0.1.0依赖于
com.github.aliteralmind / templatefeather / 0.1.0 (及其依赖项)${java.home}/../lib/tools.jar (这被认为是"提供",因为它是JDK的一部分,而不是Maven Central)仅用于编译和执行单元测试的依赖项。
这些都是核心编译所需要的。
所有项目的: junit / junit / 4.11 (及其依赖项: hamcrest核心)
用于编译“代码集”(仅供javadoc.exe使用)和执行javadoc.exe
这些都是核心编译所需要的。
所有项目的: com.github.aliteralmind / codelet / 0.1.0 (及其所有“核心编译”依赖项)
(一些背景:代码网使用内联标记将示例代码自动插入到JavaDoc中,如
{@.codelet.and.out com.github.mylibrary.examples.AGoodExample}这些可选的“代码类”称为“自定义器”,在运行javadoc.exe之前进行编译。它们用于自定义示例代码的显示方式。编译后,Codelet将通过javadoc.exe自动执行,就像所有内联标记一样。)
对于核心编译,它几乎是线性的:
但是对于"javadoc",这三个项目都依赖于Codelet。因此,即使是XBN也依赖于Codelet...which,Feather...which也依赖于XBN。
所有这三个项目中的POMs都在工作,尽管这只是与签署far并将far推送到Maven Central有关。
在阅读了Maven的依赖机制文档之后,这三个项目似乎都有相同的平面依赖树
<dependencies>
<dependency>
<groupId>com.github.aliteralmind</groupId>
<artifactId>templatefeather</artifactId>
<version>0.1.0</version>
</dependency>
<dependency>
<groupId>com.github.aliteralmind</groupId>
<artifactId>codelet</artifactId>
<version>0.1.0</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>4.0</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.3.2</version>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>16.0</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>但是正确的方法是拥有一个父项目,它是由另外两个项目继承的。似乎XBN-Java应该是父级的,但考虑到依赖关系的递归性质,我不确定。
我不明白dependencies和dependencyManagement之间的区别(为什么有些dependencies块可以直接进入项目本身,而另一些块则是dependencyManagement...although中的子块(这似乎与父-子)有关),我也不明白"javadoc“如何适合"作用域”属性。虽然compile和test是明确列出的,但是页面上甚至不存在"doc“这个词。
请给我一些建议。谢谢。
发布于 2014-07-19 02:53:50
如果您的代码需要什么,但不需要编译时(仅用于运行时),那么就声明依赖项,但是添加一个运行时作用域。
现在,如果您想提供一个“初学者父级”pom.xml,那么发布一个“初学者父级”pom.xml,但不要在实际构建链中使用它。
https://stackoverflow.com/questions/24836224
复制相似问题