该项目是一个包含核心库代码,测试和示例代码的库。在构建过程结束时,应创建以下存档:
xy-1.1.0-core.jar
xy-1.1.0-tests.jar
xy-1.1.0-examples.jar
用maven设置它的最佳方法是什么? 目前的设置是:
src
src/main/java
src/examples/java
src/test/java
此外,应该有一个包含所有依赖项的lib
目录。
应将xy-jars,库jar和其他脚本打包到发布文件xy-1.1.0.tar.gz
中。
答案 0 :(得分:5)
Maven的一大优势(或缺点,取决于你与谁交谈)是“约会优于配置” - 这意味着你可以选择试图将你的应用程序撬到Maven,或者试图将Maven撬到你的应用程序 - 将你的应用程序撬到Maven通常要容易得多。
将单个“项目”分解为两个Maven项目(核心和示例)可能会更容易。 Maven将“项目”视为创建单个工件的东西 - 也就是JAR文件,WAR文件,EAR文件等(对此有一些例外 - 例如测试jar,但我们稍后会讨论它。)将“示例”视为一个依赖于“核心”项目的模块,子项目或单独项目可能会更容易。
“测试”部分是否仅包含“核心”或“核心”和“示例”的测试?如果它只是核心,那么你会想把它移到核心项目的测试目录中。如果是两者,您将需要将其拆分并将单元测试移动到适当的项目中。
您可以通过配置maven-jar-plugin来生成项目测试代码的JAR,详见guide to attached tests。
Maven将通过Maven构建的所有程序的所有依赖关系保存在“本地存储库”中 - 通常存储在%user_directory%/。m2下的许多目录中 - 您可以让Maven将项目的所有依赖项复制到指定的目录中通过使用依赖关系:复制依赖关系,详见dependency plugin page。
要构建最终的tar,您将使用之前的项目构建Assembly。
答案 1 :(得分:2)
Nate在很大程度上涵盖了这一点,但我会给出具体的例子。
以下是目录布局的样子:
pom.xml
src/main/assembly/assembly.xml
core/pom.xml
core/src/main/java/...
core/src/test/java/...
examples/pom.xml
examples/src/main/java/...
在基础pom中,您将表示您的子模块如下:
<modules>
<modules>core</modules>
<modules>examples</modules>
</modules>
假设你的base groupId是“com.company.example”而你的artifactId是“xy”,那么你的模块poms将从以下开始(当然要调整名称和版本):
<parent>
<groupId>com.company.example</groupId>
<artifactId>xy</artifactId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<groupId>com.company.example</groupId>
<artifactId>xy-core</artifactId>
<version>1.0.0-SNAPSHOT</version>
要确保程序集在基础项目中运行,请在构建配置中包含以下内容:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.1</version>
<configuration>
<descriptors>
<descriptor>src/main/assembly/assembly.xml</descriptor>
</descriptors>
</configuration>
</plugin>
另外,要为测试类构建一个单独的jar,请将其添加到core / pom.xml文件中:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>jar</goal>
<goal>test-jar</goal>
</goals>
</execution>
</executions>
</plugin>
assembly.xml本身将如下所示:
<assembly>
<id>assembly</id>
<formats>
<format>tar.gz</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<moduleSets>
<moduleSet>
<binaries>
<dependencySets>
<dependencySet>
<outputDirectory>lib</outputDirectory>
</dependencySet>
</dependencySets>
<outputDirectory>lib</outputDirectory>
</binaries>
</moduleSet>
</moduleSets>
</assembly>
我可能在这里遗漏了一些东西,但这是一般的想法。