開発者ドキュメント

Maven – Java Webアプリケーションプロジェクトの作成方法


画像、幅= 556、高さ= 501

このチュートリアルでは、Mavenを使用してJava Webプロジェクトを管理する方法を説明します。最後に、Spring MVC Webアプリケーションを作成し、JSPページに現在の日付を表示します。

使用される技術:

  1. Maven 3.5.3

  2. JDK 8

  3. Spring 5.1.0.RELEASE

  4. JUnit 5

  5. ログバック1.2.3

  6. Jetty 9.4.xまたはTomcat 8.5

1. MavenテンプレートからWebプロジェクトを作成する

Mavenテンプレート `maven-archetype-webapp`からWebプロジェクトを作成します

mvn archetype:generate
    -DgroupId={project-packaging}
    -DartifactId={project-name}
    -DarchetypeArtifactId={maven-template}
    -DinteractiveMode=false

例えば、

D:\>mvn archetype:generate -DgroupId=com.mkyong.web -DartifactId=java-web-project -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false
[INFO]Scanning for projects...[INFO][INFO]------------------< org.apache.maven:standalone-pom >-------------------[INFO]Building Maven Stub Project (No POM) 1[INFO]--------------------------------[pom]---------------------------------[INFO][INFO]>>> maven-archetype-plugin:3.0.1:generate (default-cli) > generate-sources @ standalone-pom >>>[INFO][INFO]<<< maven-archetype-plugin:3.0.1:generate (default-cli) < generate-sources @ standalone-pom <<<[INFO][INFO][INFO]--- maven-archetype-plugin:3.0.1:generate (default-cli) @ standalone-pom ---[INFO]Generating project in Batch mode[INFO]----------------------------------------------------------------------------[INFO]Using following parameters for creating project from Old (1.x) Archetype: maven-archetype-webapp:1.0[INFO]----------------------------------------------------------------------------[INFO]Parameter: basedir, Value: D:\[INFO]Parameter: package, Value: com.mkyong.web[INFO]Parameter: groupId, Value: com.mkyong.web[INFO]Parameter: artifactId, Value: java-web-project[INFO]Parameter: packageName, Value: com.mkyong.web[INFO]Parameter: version, Value: 1.0-SNAPSHOT[INFO]project created from Old (1.x) Archetype in dir: D:\java-web-project[INFO]------------------------------------------------------------------------[INFO]BUILD SUCCESS[INFO]------------------------------------------------------------------------[INFO]Total time: 6.509 s[INFO]Finished at: 2018-10-04T15:25:16+08:00[INFO]------------------------------------------------------------------------

2. Mavenテンプレート

2.1以下のプロジェクトディレクトリ構造が作成されます。




P.S上記の図はIntelliJ IDEAからキャプチャされ、

.idea`や

java-web-project.iml`

のようなIDEフォルダは無視されます

2.2生成された `pom.xml`を見直してください。

pom.xml

<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/maven-v4__0__0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.mkyong.web</groupId>
  <artifactId>java-web-project</artifactId>
  <packaging>war</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>java-web-project Maven Webapp</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
  <build>
    <finalName>java-web-project</finalName>
  </build>
</project>

__P.S生成されたファイルはあまり価値がないので、後ですべてを更新します。まず、 `web.xml`を削除します。これは必要ありません。

3. POMを更新する

3.1 `pom.xml`ファイルを更新し、Webフレームワーク用のSpring MVC、ユニットテスト用のJUnit、WebプロジェクトをテストするJettyサーバ、さらにMavenのいくつかの設定を追加します。

pom.xml

<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/maven-v4__0__0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.mkyong.web</groupId>
    <artifactId>java-web-project</artifactId>
    <packaging>war</packaging>
    <version>1.0-SNAPSHOT</version>
    <name>java-web-project Maven Webapp</name>
    <url>http://maven.apache.org</url>
    <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>
        <spring.version>5.1.0.RELEASE</spring.version>
    </properties>

    <dependencies>

        <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>

        <!-- junit 5, unit test -->
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <version>5.3.1</version>
            <scope>test</scope>
        </dependency>

        <!-- unit test -->
        <dependency>
            <groupId>org.hamcrest</groupId>
            <artifactId>hamcrest-library</artifactId>
            <version>1.3</version>
            <scope>test</scope>
        </dependency>

        <!-- for web servlet -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>

        <!-- Some containers like Tomcat don't have jstl library -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
            <scope>provided</scope>
        </dependency>

    </dependencies>
    <build>
        <finalName>java-web-project</finalName>
        <plugins>
            <!-- http://www.eclipse.org/jetty/documentation/current/jetty-maven-plugin.html -->
            <plugin>
                <groupId>org.eclipse.jetty</groupId>
                <artifactId>jetty-maven-plugin</artifactId>
                <version>9.4.12.v20180830</version>
            </plugin>

            <!-- Default is too old, update to latest to run the latest Spring 5 + jUnit 5 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.22.0</version>
            </plugin>

            <!-- Default 2.2 is too old, update to latest -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>3.2.2</version>
            </plugin>

        </plugins>
    </build>

</project>

3.2プロジェクトの依存関係を表示します。

D:\> mvn dependency:tree

...

[INFO]--- maven-dependency-plugin:2.8:tree (default-cli) @ java-web-project ---

[INFO]com.mkyong.web:java-web-project:war:1.0-SNAPSHOT

[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-context: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.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.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]\- javax.servlet:jstl:jar:1.2:provided

[INFO]------------------------------------------------------------------------

[INFO]BUILD SUCCESS

[INFO]------------------------------------------------------------------------

[INFO]Total time: 0.931 s

[INFO]Finished at: 2018-10-08T15:55:08+08:00

[INFO]------------------------------------------------------------------------

4. Spring MVC + JSP + LogBack

4.1 Create a few files to bootstrap Spring MVC web project.

SpringConfig.java

パッケージcom.mkyong.web.config;

import org.springframework.context.annotation.Bean;インポートorg.springframework.context.annotation.ComponentScan;インポートorg.springframework.context.annotation.Configuration; org.springframework.web.servlet.config.annotation.EnableWebMvcをインポートします。 org.springframework.web.servlet.config.annotation.ResourceHandlerRegistryをインポートします。 org.springframework.web.servlet.config.annotation.WebMvcConfigurerをインポートします。インポートorg.springframework.web.servlet.view.InternalResourceViewResolver;インポートorg.springframework.web.servlet.view.JstlView;

@EnableWebMvc @Configuration @ComponentScan({"com.mkyong.web"})publicクラスSpringConfigはWebMvcConfigurer {

@Override public void addResourceHandlers(ResourceHandlerRegistryレジストリ){registry.addResourceHandler( "/resources/** ** ").addResourceLocations( "/resources/"); }

@豆
    public InternalResourceViewResolver viewResolver(){
        InternalResourceViewResolver viewResolver
                = new InternalResourceViewResolver();
        viewResolver.setViewClass(JstlView.class);
        viewResolver.setPrefix( "/WEB-INF/views/");
        viewResolver.setSuffix( ".jsp");
        return viewResolver;
    }
}

WebInitializer.java

パッケージcom.mkyong.web;

import com.mkyong.web.config.SpringConfig;インポートorg.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

パブリッククラスWebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

@Override protected Class <?>[]getRootConfigClasses(){nullを返します。 }

@Override protected Class <?>[]getServletConfigClasses(){新しいクラス[]{SpringConfig.class}を返します。 }

@Override protected String[]getServletMappings(){新しいString[]{"/"}を返します。 }

}

WelcomeController.java

パッケージcom.mkyong.web.controller;

インポートorg.slf4j.Logger;インポートorg.slf4j.LoggerFactory;インポートorg.springframework.stereotype.Controller;インポートorg.springframework.ui.Model;インポートorg.springframework.web.bind.annotation.GetMapping;

import java.util.Date;

@Controller public class WelcomeController {

プライベート最終ロガーロガー= LoggerFactory.getLogger(ウェルカムコントローラー。クラス);

@GetMapping( "/")public String index(モデルモデル){logger.debug( "ようこそmkyong.com ..."); model.addAttribute( "msg"、getMessage()); model.addAttribute( "today"、new Date());インデックスを返します。

}

プライベートString getMessage(){return "Hello World"; }

}

4.2

index.jsp`ファイルを

WEB-INF`フォルダに移動して更新します

index.jsp

<%@ taglib prefix = "fmt" uri = "http://java.sun.com/jsp/jstl/fmt"%>
<html>
<body>
<h1> $ {msg} </h1>
<h2>今日は<fmt:formatDate value = "$ {today}"パターン= "yyy-MM-dd"/> </h2>です。
</body>
</html>

4.3コンソールにログを記録する。

logbacl.xml

<?xml version = "1.0" encoding = "UTF-8"?> <configuration>

<appender name = "STDOUT" class = "ch.qos.logback.core.ConsoleAppender"> <layout class = "ch.qos.logback.classic.PatternLayout">

<パターン>%d {yyyy-MM-dd HH:mm:ss}[%スレッド]%-5level%logger {36}  - %msg%n </Pattern>

</layout> </appender>

<logger name = "com.mkyong.web" level = "debug" additivity = "false"> <appender-ref ref = "STDOUT"/> </logger>

<root level = "error"> <appender-ref ref = "STDOUT"/> </root>

</configuration>

5.単体テスト

単純なSpring MVC 5 JUnit 5の例です。

TestWelcome.java

パッケージcom.mkyong.web;

import com.mkyong.web.config.SpringConfig; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test;インポートorg.springframework.beans.factory.annotation.Autowired;インポートorg.springframework.test.context.junit.jupiter.web.SpringJUnitWebConfig;インポートorg.springframework.test.web.servlet.MockMvc; org.springframework.test.web.servlet.setup.MockMvcBuildersをインポートします。 org.springframework.web.context.WebApplicationContextをインポートします。

import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers。** ;

@SpringJUnitWebConfig(SpringConfig.class)パブリッククラスTestWelcome {

プライベートMockMvc mockMvc;

@ AutowiredプライベートWebApplicationContext webAppContext;

@BeforeEach public void setup(){mockMvc = MockMvcBuilders.webAppContextSetup(webAppContext)。ビルド(); }

@Test public void testWelcome()throws Exception {

isOk()).andExpect(view()。name( "index")).andExpect(forwardedUrl())このメソッドは、 "/WEB-INF/views/index.jsp")).andExpect(model()。attribute( "msg"、 "Hello World")); }

}

6.ディレクトリ構造

最終的なファイルとディレクトリ構造を確認します。




これを読む

Maven
標準ディレクトリレイアウト

を選択します。

7.デモ

7.1 Jetty WebサーバーでWebプロジェクトをテストする –

mvn jetty:run

D:\> mvn jetty:run

[INFO]webAppSourceDirectory not set. Trying src\main\webapp

[INFO]Reload Mechanic: automatic

[INFO]nonBlocking:false

[INFO]Classes = D:\java-web-project\target\classes

[INFO]Configuring Jetty for project: java-web-project Maven Webapp

[INFO]Logging initialized @4821ms to org.eclipse.jetty.util.log.Slf4jLog

[INFO]Context path =/

[INFO]Tmp directory = D:\java-web-project\target\tmp

[INFO]Web defaults = org/eclipse/jetty/webapp/webdefault.xml

[INFO]Web overrides =  none

[INFO]web.xml file = null

[INFO]Webapp directory = D:\java-web-project\src\main\webapp

[INFO]jetty-9.4.12.v20180830; built: 2018-08-30T13:59:14.071Z; git: 27208684755d94a92186989f695db2d7b21ebc51; jvm 10.0.1+10

...
[INFO]1 Spring WebApplicationInitializers detected on classpath
2018-10-08 15:11:50[main]DEBUG com.mkyong.web.WebInitializer - No ContextLoaderListener registered, as createRootApplicationContext() did not return an application context[INFO]DefaultSessionIdManager workerName=node0[INFO]No SessionScavenger set, using defaults[INFO]node0 Scavenging every 660000ms[INFO]Initializing Spring DispatcherServlet 'dispatcher'[INFO]Started o.e.j.m.p.JettyWebAppContext@68a78f3c{/,file:///D:/java-web-project/src/main/webapp/,AVAILABLE}{file:///D:/java-web-project/src/main/webapp/}[INFO]Started ServerConnector@3355168{HTTP/1.1,[http/1.1]}{0.0.0.0:8080}[INFO]Started @6271ms[INFO]Started Jetty Server
2018-10-08 15:12:01[qtp1373051324-19]DEBUG c.m.web.controller.WelcomeController - Welcome to mkyong.com...

7.2


http://localhost:8080/


によってアクセスする



__P.S CTRL Cを押してJetty Webサーバーを停止します。

8.デプロイメント

8.1展開のためのWARファイルを生成する

mvn package

D:\> mvn package

...

[INFO]Packaging webapp

[INFO]Assembling webapp[java-web-project]in[D:\java-web-project\target\java-web-project]

[INFO]Processing war project

[INFO]Copying webapp resources[D:\java-web-project\src\main\webapp]

[INFO]Webapp assembled in[89 msecs]

[INFO]Building war: D:\java-web-project\target\java-web-project.war

[INFO]------------------------------------------------------------------------

[INFO]BUILD SUCCESS

[INFO]------------------------------------------------------------------------

[INFO]Total time: 3.844 s

[INFO]Finished at: 2018-10-08T15:31:12+08:00

[INFO]------------------------------------------------------------------------

The default directory for the generated WAR is

target/finalName

. Done.

Download Source Code

$ git clone

https://github.com/mkyong/maven-examples.git


$ cd java-web-project

$ mvn jetty:run

モバイルバージョンを終了