在Java项目中,咱们一般会会把一个项目分拆为模块,这是为了下降软件复杂度。
例如:咱们能够把一个大的项目氛围module-a, module-b, module-c三个模块,这样咱们就能够下降软件的复杂度。
maven能够有效管理多个模块java
不要忘了log4j2.xml文件
Greeting.javashell
package com.greeting; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; public class Greeting { public static void print(String name){ Log log = LogFactory.getLog(Greeting.class); log.info("Hello,"+name+"!"); } }
GreetingTest.javaapache
package com.greeting; import org.junit.Test; public class GreetingTest { @Test public void print() { Greeting.print("Test"); } }
pom.xmlmaven
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>com.csj2018</groupId> <artifactId>parent</artifactId> <version>1.0-SNAPSHOT</version> <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>greeting</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> </project>
App.java模块化
package com.hellomaven; import com.greeting.Greeting; public class App { public static void main(String[] args){ Greeting.print("Maven"); } }
AppTest.javaui
package com.hellomaven; import org.junit.Test; public class AppTest { @Test public void main() { App.main(null); } }
pom.xmlcode
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>com.csj2018</groupId> <artifactId>parent</artifactId> <version>1.0-SNAPSHOT</version> <relativePath>../parent/pom.xml</relativePath> </parent> <!--<groupId>com.csj2018</groupId>继承parent,能够删除--> <artifactId>hellomaven</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <dependencies> <dependency> <groupId>com.csj2018</groupId> <artifactId>greeting</artifactId> <version>1.0-SNAPSHOT</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.2.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>com.hellomaven.App</mainClass> </transformer> </transformers> </configuration> </execution> </executions> </plugin> </plugins> </build> </project>
模块greeting,hellomaven的pom文件高度类似,咱们能够提取出共同部分做为parent,而模块greeting,hellomaven分别从parent继承,就能够简化greeting,hellomaven2个模块自身的配置。
parent的packaging是pom,不是jar,是由于parent自己不包含任何Java代码/
pom.xmlorm
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.csj2018</groupId> <artifactId>parent</artifactId> <version>1.0-SNAPSHOT</version> <packaging>pom</packaging> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <java.verison>1.8</java.verison> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-jcl</artifactId> <version>2.10.0</version> <scope>runtime</scope> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.10.0</version> <scope>runtime</scope> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> </dependencies> </project>
运行hellomaven的App.java,结果以下
xml
进入hellomaven,编译提示找不到greeting的jar包blog
mvn clean compile
若是模块A依赖模块B,则模块须要模块B的jar包才能正常编译
中央仓库:发布者将模块B发布到maven中央仓库,模块A从中央仓库获取模块B。
私有仓库:内网中,发布者将模块B发布到私有仓库,模块A从中央仓库获取模块B。
本地仓库:发布者使用mvn clean install将模块B发布到maven本地仓库,模块A从本地仓库获取模块B。不推荐,由于每次修改模块B源码,都须要从新安装。会出现版本不一致的状况。
模块化编译:
<modules> <module>模块A</module> <module>模块B</module> </modules>
pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.csj2018</groupId> <artifactId>build</artifactId> <version>1.0-SNAPSHOT</version> <packaging>pom</packaging> <modules> <module>../parent</module> <module>../greeting</module> <module>../hellomaven</module> </modules> </project>
进入build根目录,再次编译成功
打包,运行jar包
mvn clean package #进入hellomaven/target目录下,运行jar包 cd ../hellomaven/target java -jar hellomaven-1.0-SNAPSHOT.jar