Maven – マルチモジュールプロジェクトの作成方法
このチュートリアルでは、Mavenを使用して4つのモジュールを含むマルチモジュールプロジェクトを管理する方法を説明します。
-
パスワードモジュール – インターフェイスのみ.
-
パスワードmd5モジュール – パスワードモジュールの実装、MD5パスワード
ハッシュ。
-
パスワードshaモジュール – パスワードモジュールの実装、SHAパスワード
ハッシュ。
-
Webモジュール – 単純なMVC Webアプリケーションで、入力をMD5または
SHAアルゴリズム。
モジュールの依存関係。
$ password $ password <-- password-md5 $ password <-- password-sha $ web <-- (password-md5 | password-sha) <-- password
いくつかのコマンドは、例えば、マルチモジュールプロジェクトをビルドするためのものです。
$ mvn -pl password compile # compile password module only $ mvn -pl password-sha compile # compile password-sha module, also dependency - password $ mvn -pl web compile # compile web module only $ mvn -am -pl web compile # compile web module, also dependency - password-sha or password-md5, password $ mvn -pl web jetty:run # run web module with Jetty $ mvn compile # compile everything
使用される技術:
-
Maven 3.5.3
-
JDK 8
-
Spring 5.1.0.RELEASE
-
タイムリーフ3.0.10.RELEASE
1.ディレクトリ構造
マルチモジュールのプロジェクトレイアウトでは、親プロジェクトには親
pom.xml`があり、各サブモジュール(サブプロジェクト)にも
pom.xml`があります
2. Maven POM
MavenのマルチモジュールPOMファイルを見てみましょう。
2.1親POMファイル。パッケージは `pom`です。
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> <!-- parent pom --> <groupId>com.mkyong.multi</groupId> <artifactId>java-multi-modules</artifactId> <packaging>pom</packaging> <version>1.0</version> <!-- sub modules --> <modules> <module>web</module> <module>password</module> <module>password-sha</module> <module>password-md5</module> </modules> </project>
2.2パスワードモジュール。
パスワード/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"> <!-- parent pom --> <parent> <artifactId>java-multi-modules</artifactId> <groupId>com.mkyong.multi</groupId> <version>1.0</version> </parent> <modelVersion>4.0.0</modelVersion> <!-- password info --> <groupId>com.mkyong.password</groupId> <artifactId>password</artifactId> <version>1.0</version> <packaging>jar</packaging> </project>
2.3 password-md5モジュール内。
パスワード-md5/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"> <parent> <artifactId>java-multi-modules</artifactId> <groupId>com.mkyong.multi</groupId> <version>1.0</version> </parent> <modelVersion>4.0.0</modelVersion> <!-- password-md5 info --> <groupId>com.mkyong.password</groupId> <artifactId>password-md5</artifactId> <version>1.0</version> <packaging>jar</packaging> <dependencies> <dependency> <groupId>com.mkyong.password</groupId> <artifactId>password</artifactId> <version>1.0</version> </dependency> </dependencies> </project>
2.4 password-shaモジュール。
password-sha/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"> <parent> <artifactId>java-multi-modules</artifactId> <groupId>com.mkyong.multi</groupId> <version>1.0</version> </parent> <modelVersion>4.0.0</modelVersion> <!-- password-sha info --> <groupId>com.mkyong.password</groupId> <artifactId>password-sha</artifactId> <version>1.0</version> <packaging>jar</packaging> <dependencies> <dependency> <groupId>com.mkyong.password</groupId> <artifactId>password</artifactId> <version>1.0</version> </dependency> </dependencies> </project>
2.4 Webモジュール内。
web/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"> <!-- this is a parent pom --> <parent> <groupId>com.mkyong.multi</groupId> <artifactId>java-multi-modules</artifactId> <version>1.0</version> </parent> <modelVersion>4.0.0</modelVersion> <!-- web project info --> <groupId>com.mkyong</groupId> <artifactId>web</artifactId> <version>1.0</version> <packaging>war</packaging> <dependencies> <!-- md5 or sha hashing --> <!-- md5 hash <dependency> <groupId>com.mkyong.password</groupId> <artifactId>password-md5</artifactId> <version>1.0</version> </dependency> --> <!-- sha --> <dependency> <groupId>com.mkyong.password</groupId> <artifactId>password-sha</artifactId> <version>1.0</version> </dependency> </dependencies> </project>
3.親プロジェクト
3.1親pom、それらのプロパティと依存関係(JDK 8、JUnit 5、Spring 5)はすべてのサブモジュールで共有されます。
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.mkyong.multi</groupId> <artifactId>java-multi-modules</artifactId> <packaging>pom</packaging> <version>1.0</version> <properties> <!-- https://maven.apache.org/general.html#encoding-warning --> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <junit.version>5.3.1</junit.version> <spring.version>5.1.0.RELEASE</spring.version> </properties> <modules> <module>web</module> <module>password</module> <module>password-sha</module> <module>password-md5</module> </modules> <dependencies> <!-- Spring DI for all modules --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <!-- unit test --> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-engine</artifactId> <version>${junit.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-params</artifactId> <version>${junit.version}</version> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.22.0</version> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <version>3.1.1</version> </plugin> </plugins> </build> </project>
4.パスワードモジュール
4.1 1つのインタフェースのみを含むモジュール。
4.2 POMファイル。
パスワード/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"> <parent> <artifactId>java-multi-modules</artifactId> <groupId>com.mkyong.multi</groupId> <version>1.0</version> </parent> <modelVersion>4.0.0</modelVersion> <groupId>com.mkyong.password</groupId> <artifactId>password</artifactId> <version>1.0</version> <packaging>jar</packaging> </project>
4.3インターフェース。
PasswordService.java
package com.mkyong.password; public interface PasswordService { String hash(String input); String algorithm(); }
5.パスワード-md5モジュール
5.1パスワードモジュールの実装。
5.2 POMファイル。
パスワード-md5/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"> <parent> <artifactId>java-multi-modules</artifactId> <groupId>com.mkyong.multi</groupId> <version>1.0</version> </parent> <modelVersion>4.0.0</modelVersion> <!-- password-md5 info --> <groupId>com.mkyong.password</groupId> <artifactId>password-md5</artifactId> <version>1.0</version> <packaging>jar</packaging> <dependencies> <dependency> <groupId>com.mkyong.password</groupId> <artifactId>password</artifactId> <version>1.0</version> </dependency> </dependencies> </project>
5.3 MD5ハッシング。
PasswordServiceImpl.java
package com.mkyong.password; import org.springframework.stereotype.Service; import java.nio.charset.StandardCharsets; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; @Service public class PasswordServiceImpl implements PasswordService { @Override public String hash(String input) { return md5(input); } @Override public String algorithm() { return "md5"; } private String md5(String input) { StringBuilder result = new StringBuilder(); MessageDigest md; try { md = MessageDigest.getInstance("MD5"); byte[]hashInBytes = md.digest(input.getBytes(StandardCharsets.UTF__8)); for (byte b : hashInBytes) { result.append(String.format("%02x", b)); } } catch (NoSuchAlgorithmException e) { throw new IllegalArgumentException(e); } return result.toString(); } }
5.4ユニットテスト。
TestPasswordService.java
package com.mkyong.password; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; import static org.junit.jupiter.api.Assertions.assertEquals; public class TestPasswordService { PasswordService passwordService; @BeforeEach void init() { passwordService = new PasswordServiceImpl(); } @DisplayName("md5 -> hex") @ParameterizedTest @CsvSource({ "123456, e10adc3949ba59abbe56e057f20f883e", "hello world, 5eb63bbbe01eeed093cb22bb8f5acdc3" }) void testMd5hex(String input, String expected) { assertEquals(expected, passwordService.hash(input)); } }
パスワードシャーモジュール
6.1パスワードモジュールの実装。
6.2 POMファイル。
password-sha/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"> <parent> <artifactId>java-multi-modules</artifactId> <groupId>com.mkyong.multi</groupId> <version>1.0</version> </parent> <modelVersion>4.0.0</modelVersion> <groupId>com.mkyong.password</groupId> <artifactId>password-sha</artifactId> <version>1.0</version> <packaging>jar</packaging> <properties> <commos.codec.version>1.11</commos.codec.version> </properties> <dependencies> <dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> <version>${commos.codec.version}</version> </dependency> <dependency> <groupId>com.mkyong.password</groupId> <artifactId>password</artifactId> <version>1.0</version> </dependency> </dependencies> </project>
6.3
Apache共通コーデックライブラリ
を使ったSHAハッシング
PasswordServiceImpl.java
package com.mkyong.password; import org.apache.commons.codec.digest.DigestUtils; import org.springframework.stereotype.Service; @Service public class PasswordServiceImpl implements PasswordService { @Override public String hash(String input) { return DigestUtils.sha256Hex(input); } @Override public String algorithm() { return "sha256"; } }
6.4ユニットテスト。
TestPasswordService.java
package com.mkyong.password; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; import static org.junit.jupiter.api.Assertions.assertEquals; public class TestPasswordService { PasswordService passwordService; @BeforeEach void init() { passwordService = new PasswordServiceImpl(); } @DisplayName("sha256 -> hex") @ParameterizedTest @CsvSource({ "123456, 8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92", "hello world, b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9" }) void testSha256hex(String input, String expected) { assertEquals(expected, passwordService.hash(input)); } }
7. Webモジュール
7.1 Spring MCVのthymeleaf Webアプリケーション。md5またはshaアルゴリズムで入力をハッシュします。
7.2 POMファイル。
web/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"> <!-- this is a parent pom --> <parent> <groupId>com.mkyong.multi</groupId> <artifactId>java-multi-modules</artifactId> <version>1.0</version> </parent> <modelVersion>4.0.0</modelVersion> <!-- web project info --> <groupId>com.mkyong</groupId> <artifactId>web</artifactId> <version>1.0</version> <packaging>war</packaging> <properties> <thymeleaf.version>3.0.10.RELEASE</thymeleaf.version> </properties> <dependencies> <!-- md5 hash <dependency> <groupId>com.mkyong.password</groupId> <artifactId>password-md5</artifactId> <version>1.0</version> </dependency> --> <!-- sha --> <dependency> <groupId>com.mkyong.password</groupId> <artifactId>password-sha</artifactId> <version>1.0</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${spring.version}</version> </dependency> <!-- logging , spring 5 no more bridge, thanks spring-jcl --> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.3</version> </dependency> <!-- need this for unit test --> <dependency> <groupId>org.hamcrest</groupId> <artifactId>hamcrest-library</artifactId> <version>1.3</version> <scope>test</scope> </dependency> <!-- servlet api --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> <!-- thymeleaf view --> <dependency> <groupId>org.thymeleaf</groupId> <artifactId>thymeleaf</artifactId> <version>${thymeleaf.version}</version> </dependency> <dependency> <groupId>org.thymeleaf</groupId> <artifactId>thymeleaf-spring5</artifactId> <version>${thymeleaf.version}</version> </dependency> </dependencies> <build> <finalName>java-web-project</finalName> <plugins> <plugin> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-maven-plugin</artifactId> <version>9.4.12.v20180830</version> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>3.2.2</version> </plugin> </plugins> </build> </project>
7.3 Webモジュールの依存性
ターミナル
$ mvn -pl web dependency:tree [INFO]com.mkyong:web:war:1.0[INFO]+- com.mkyong.password:password-sha:jar:1.0:compile[INFO]| +- commons-codec:commons-codec:jar:1.11:compile[INFO]| \- com.mkyong.password:password:jar:1.0:compile[INFO]+- org.springframework:spring-webmvc:jar:5.1.0.RELEASE:compile[INFO]| +- org.springframework:spring-aop:jar:5.1.0.RELEASE:compile[INFO]| +- org.springframework:spring-beans:jar:5.1.0.RELEASE:compile[INFO]| +- org.springframework:spring-core:jar:5.1.0.RELEASE:compile[INFO]| | \- org.springframework:spring-jcl:jar:5.1.0.RELEASE:compile[INFO]| +- org.springframework:spring-expression:jar:5.1.0.RELEASE:compile[INFO]| \- org.springframework:spring-web:jar:5.1.0.RELEASE:compile[INFO]+- org.springframework:spring-test:jar:5.1.0.RELEASE:compile[INFO]+- ch.qos.logback:logback-classic:jar:1.2.3:compile[INFO]| +- ch.qos.logback:logback-core:jar:1.2.3:compile[INFO]| \- org.slf4j:slf4j-api:jar:1.7.25:compile[INFO]+- org.hamcrest:hamcrest-library:jar:1.3:test[INFO]| \- org.hamcrest:hamcrest-core:jar:1.3:test[INFO]+- javax.servlet:javax.servlet-api:jar:3.1.0:provided[INFO]+- org.thymeleaf:thymeleaf:jar:3.0.10.RELEASE:compile[INFO]| +- ognl:ognl:jar:3.1.12:compile[INFO]| | \- org.javassist:javassist:jar:3.20.0-GA:compile[INFO]| +- org.attoparser:attoparser:jar:2.0.5.RELEASE:compile[INFO]| \- org.unbescape:unbescape:jar:1.1.6.RELEASE:compile[INFO]+- org.thymeleaf:thymeleaf-spring5:jar:3.0.10.RELEASE:compile[INFO]+- org.springframework:spring-context:jar:5.1.0.RELEASE:compile[INFO]+- org.junit.jupiter:junit-jupiter-engine:jar:5.3.1:test[INFO]| +- org.apiguardian:apiguardian-api:jar:1.0.0:test[INFO]| +- org.junit.platform:junit-platform-engine:jar:1.3.1:test[INFO]| | +- org.junit.platform:junit-platform-commons:jar:1.3.1:test[INFO]| | \- org.opentest4j:opentest4j:jar:1.1.1:test[INFO]| \- org.junit.jupiter:junit-jupiter-api:jar:5.3.1:test[INFO]\- org.junit.jupiter:junit-jupiter-params:jar:5.3.1:test[INFO]------------------------------------------------------------------------
7.4春のもの、thymeleafと設定を統合する。
SpringConfig.java
package com.mkyong.web.config; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import org.thymeleaf.spring5.SpringTemplateEngine; import org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver; import org.thymeleaf.spring5.view.ThymeleafViewResolver; import org.thymeleaf.templatemode.TemplateMode; @EnableWebMvc @Configuration @ComponentScan({"com.mkyong"}) public class SpringConfig implements WebMvcConfigurer { @Autowired private ApplicationContext applicationContext; @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/resources/** ** ") .addResourceLocations("/resources/"); } @Bean public SpringResourceTemplateResolver templateResolver() { SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver(); templateResolver.setApplicationContext(this.applicationContext); templateResolver.setPrefix("/WEB-INF/views/"); templateResolver.setSuffix(".html"); templateResolver.setTemplateMode(TemplateMode.HTML); templateResolver.setCacheable(true); return templateResolver; } @Bean public SpringTemplateEngine templateEngine() { SpringTemplateEngine templateEngine = new SpringTemplateEngine(); templateEngine.setTemplateResolver(templateResolver()); templateEngine.setEnableSpringELCompiler(true); return templateEngine; } @Bean public ThymeleafViewResolver viewResolver() { ThymeleafViewResolver viewResolver = new ThymeleafViewResolver(); viewResolver.setTemplateEngine(templateEngine()); return viewResolver; } }
WebInitializer.java
package com.mkyong.web; import com.mkyong.web.config.SpringConfig; import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer; public class WebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { @Override protected Class<?>[]getRootConfigClasses() { return null; } @Override protected Class<?>[]getServletConfigClasses() { return new Class[]{SpringConfig.class}; } @Override protected String[]getServletMappings() { return new String[]{"/"}; } }
WelcomeController.java
package com.mkyong.web.controller; import com.mkyong.password.PasswordService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; @Controller public class WelcomeController { private final Logger logger = LoggerFactory.getLogger(WelcomeController.class); @Autowired private PasswordService passwordService; @GetMapping("/") public String welcome(@RequestParam(name = "query", required = false, defaultValue = "123456") String query, Model model) { logger.debug("Welcome to mkyong.com... Query : {}", query); model.addAttribute("query", query); model.addAttribute("hash", passwordService.hash(query)); model.addAttribute("algorithm", passwordService.algorithm()); return "index"; } }
7.5 Spring MVCの単体テスト。
TestWelcome.java
package com.mkyong.web; import com.mkyong.web.config.SpringConfig; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.junit.jupiter.web.SpringJUnitWebConfig; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.web.context.WebApplicationContext; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.** ; @SpringJUnitWebConfig(SpringConfig.class) @DisplayName("Test Spring MVC default view") public class TestWelcome { private MockMvc mockMvc; @Autowired private WebApplicationContext webAppContext; @BeforeEach public void setup() { mockMvc = MockMvcBuilders.webAppContextSetup(webAppContext).build(); } @Test public void testDefault() throws Exception { this.mockMvc.perform( get("/")) .andExpect(status().isOk()) .andExpect(view().name("index")) .andExpect(model().attribute("query", "123456")); //.andExpect(model().attribute("sha256", "8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92")) //.andExpect(model().attribute("md5", "e10adc3949ba59abbe56e057f20f883e")); } }
7.6梅雨景。
index.html
<!DOCTYPE HTML> <html xmlns:th="http://www.thymeleaf.org"> <body> <h1 th:text="'Input : ' + ${query}"/> <h1 th:text="'Algorithm : ' + ${algorithm}"/> <h3 th:text="${hash}"/> </body> </html>
完了しました。
8.デモ
8.1親プロジェクトでは、標準の `mvn compile`を使ってすべてのモジュールをコンパイルします.Mavenはビルドの順序を決定します。
ターミナル
$ mvn compile [INFO]Reactor Summary:[INFO][INFO]java-multi-modules 1.0 ............................. SUCCESS[ 0.007 s][INFO]password ........................................... SUCCESS[ 0.539 s][INFO]password-sha ....................................... SUCCESS[ 0.038 s][INFO]web ................................................ SUCCESS[ 0.080 s][INFO]password-md5 1.0 ................................... SUCCESS[ 0.035 s][INFO]------------------------------------------------------------------------[INFO]BUILD SUCCESS[INFO]------------------------------------------------------------------------[INFO]Total time: 0.822 s[INFO]Finished at: 2018-10-23T15:32:21+08:00[INFO]------------------------------------------------------------------------
8.2すべてのモジュールをローカルリポジトリにインストールします。
ターミナル
$ mvn install
8.3 Webモジュールのみをコンパイルします(Mavenはローカルリポジトリからパスワードモジュールの依存関係を検出します。そのため、 `mvn install`が必要です)。
ターミナル
$ mvn -pl web compile
8.4あるいは、 `-am`を追加してWebモジュールとその依存モジュール(password-shaとpassword)をコンパイルします。
ターミナル
$ mvn -am -pl web compile [INFO]Scanning for projects...[INFO]------------------------------------------------------------------------[INFO]Reactor Build Order:[INFO][INFO]java-multi-modules [pom][INFO]password [jar][INFO]password-sha [jar][INFO]web [war] ...... [INFO]Reactor Summary: [INFO] [INFO]java-multi-modules 1.0 ............................. SUCCESS[ 0.009 s] [INFO]password ........................................... SUCCESS[ 0.534 s] [INFO]password-sha ....................................... SUCCESS[ 0.036 s] [INFO]web 1.0 ............................................ SUCCESS[ 0.077 s] [INFO]------------------------------------------------------------------------ [INFO]BUILD SUCCESS [INFO]------------------------------------------------------------------------ [INFO]Total time: 0.780 s [INFO]Finished at: 2018-10-23T15:36:16+08:00 [INFO]------------------------------------------------------------------------
8.5 Test the web module with
mvn -pl web jetty:run
command.
Terminal
$ mvn install $ mvn -pl web jetty:run //... [INFO]1 Spring WebApplicationInitializers detected on classpath [INFO]DefaultSessionIdManager workerName=node0 [INFO]No SessionScavenger set, using defaults [INFO]node0 Scavenging every 600000ms [INFO]Started ServerConnector@40a8a26f{HTTP/1.1,[http/1.1]}{0.0.0.0:8080} [INFO]Started @6398ms [INFO]Started Jetty Server
8.8 Update to md5 algorithm. Restart the Jetty server.
web/pom.xml
<! - md5 hash - > <依存関係> <groupId> com.mkyong.password </groupId> <artifactId> password-md5 </artifactId> <version> 1.0 </version> </dependency> <! - sha <依存関係> <groupId> com.mkyong.password </groupId> <artifactId> password-sha </artifactId> <version> 1.0 </version> </dependency> - >
8.9
http://localhost:8080/?query
= mkyong
===ソースコードをダウンロードする
$ git clone
https://github.com/mkyong/maven-examples.git
$ cd java-multi-modules
$ mvn install
$ mvn -pl web jetty:run
===参考文献
。
チュートリアル:
タイメレフ春
。
ウェブコンテンツの配信
Spring MVCで
。
A
マルチモジュールプロジェクト
。
Spring IO – マルチを作成する
モジュールプロジェクト
。
マルチモジュール
MavenとGradleでプロジェクトビルド
。リンク://maven/how-to-create-a-java-project-with-maven/[Maven – How to
Javaプロジェクトを作成する]。リンク://maven/how-to-create-a-web-application-project-with-maven/[Maven
– Java Webアプリケーションプロジェクトの作成方法]
リンク://タグ/ハッシュ/[ハッシング]リンク://タグ/junit-5/[junit 5]
maven
md5
マルチモジュール
sha256
spring mvc
thymeleaf