Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ビルドツールハンズオン:Apache Maven

ビルドツールハンズオン:Apache Maven

Hiroto YAMAKAWA

April 22, 2017
Tweet

More Decks by Hiroto YAMAKAWA

Other Decks in Technology

Transcript

  1. Macの⼈ ターミナル.app を起動して、mvn -version Windowsの⼈ コマンドプロンプトを起動して mvn -version
 (bash on

    windowsの⼈はちょっとわかりません、ごめんなさい) Linuxの⼈ 端末かコンソールを起動して mvn -version .BWFO͕ೖͬͯΔ͔ࢼ͢
  2. .BWFO͕ೖͬͯΔ͔ࢼ͢ mvn -version Apache Maven 3.5.0 (ff8f5e7444045639af65f6095c62210b5713f426; 2017-04-04T04:39:06+09:00) Maven home:

    /usr/local/Cellar/maven/3.5.0/libexec Java version: 1.8.0_131, vendor: Oracle Corporation Java home: /Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home/jre Default locale: ja_JP, platform encoding: UTF-8 OS name: "mac os x", version: "10.12.4", arch: "x86_64", family: "mac" こんな⾵に表⽰されれば、もう⼊ってます
 バージョンは、3.x(できれば3.3以降)であれば今⽇は困らないと思います
  3. すでにインストールできている⼈は、まわりの⼈のサポートをお願いします!
 MacでHomebrew使ってる⼈は brew install maven
 Linuxの⼈ は apt-get install maven や

    yum install maven
 WindowsでChocolatey使ってる⼈ は choco install maven
 とかの⽅がさくっと導⼊できます μ΢ϯϩʔυˍΠϯετʔϧ 上記以外の⼈は(Javaが⼊ってる前提で)
 サイトにアクセス https://maven.apache.org/ Download⇒ Binary zip か
 Binary tar.gz を
 ダウンロードしてください
  4. echo %JAVA_HOME% C:\Program Files\Java\jdk1.7.0_51 μ΢ϯϩʔυˍΠϯετʔϧ インストール⽅法は、同じくMavenのサイトの「Install」で確認
 (基本的には、ダウンロードしたファイルを解凍して、パスを通す)
 Javaのパスが通っているかも確認する Windowsの⼈の例 echo

    $JAVA_HOME /Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home export PATH=/opt/apache-maven-3.5.0/bin:$PATH Mac/Linuxの⼈の例 ⇒必要があればshの
 profileでexport ⇒システム環境設定>環境変数>ユーザ環境変数
  PATHの値に、Mavenのbinディレクトリを設定
 (他の値がある場合は、セミコロン区切り)  もし、JAVA_HOMEがなければ、JAVA_HOMEも追加 うまくいったら、コマンドプロンプトやターミナルを開き直して、mvn -version
  5. MavenでビルドできるJavaの開発プロジェクトをひな型から作成する .BWFOϓϩδΣΫτΛ࡞੒͢Δ 以降のスライドは、下のURLの⼿順で進めていきます! https://goo.gl/bU36Au mvn -B archetype:generate \ -DgroupId=com.example \

    -DartifactId=mvn-app \ -Dversion=1.0 \ -DarchetypeArtifactId=maven-archetype-quickstart ⇒ プロジェクトの識別⼦(例:グループ名、パッケージ名) ⇒ プロジェクト名 ⇒ バージョン番号 ⇒ひな形
  6. [INFO] Scanning for projects... [INFO] [INFO] ------------------------------------------------------------------------ [INFO] Building Maven

    Stub Project (No POM) 1 [INFO] ------------------------------------------------------------------------ (中略) [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 3.858 s [INFO] Finished at: 2017-04-21T21:18:01+09:00 [INFO] Final Memory: 15M/219M [INFO] ------------------------------------------------------------------------ .BWFOϓϩδΣΫτΛ࡞੒͢Δ ⇒ 作成成功!
  7. できあがるプロジェクトディレクトリ .BWFOϓϩδΣΫτΛ࡞੒͢Δ mvn-app |-- pom.xml `-- src |-- main |

    `-- java | `-- App.java `-- test `-- java `-- AppTest.java Ҿ༻ɾվมɿhttps://maven.apache.org/archetypes/maven-archetype-quickstart/ ⇒ mavenプロジェクトの設定ファイル ⇒ Javaの実⾏⽤クラス ⇒ Javaのテストケース
  8. デフォルトは https://maven.apache.org/archetypes/ に掲載されている。
 たとえば、maven-archetype-webapp はWebアプリの基本構成。 有志のひな形やフレームワーク⽤のひな形は、
 archetypeGroupIdとarchetypeArtifactIdを設定して使う。たとえば... Java8 -DarchetypeGroupId=pl.org.miki 


    -DarchetypeArtifactId=java8-quickstart-archetype Apache Wicket -DarchetypeGroupId=org.apache.wicket 
 -DarchetypeArtifactId=wicket-archetype-quickstart Jersey(JAX-RS) -DarchetypeGroupId=org.glassfish.jersey.archetypes
 -DarchetypeArtifactId=jersey-quickstart-webapp ͻͳܗͷҰཡ
  9. Intellij IDEA、Eclipse, NetBeansなど
 お⼿元のIDEで読み込んでみましょう *%&ͰϓϩδΣΫτΛಡΈࠐΉ • NetBeans
 「プロジェクトを開く」でmvn-appフォルダを選択
 読み込まれたら、プロジェクトを右クリックして「ビルド」 •

    Eclipse
 「ファイル」→「インポート」→「既存Mavenプロジェクト」でフォルダを選択
 その後にプロジェクトで右クリックし、「Maven」>「プロジェクトの更新」 • IntelliJ IDEA
 「import project」でフォルダの中の pom.xmlを選択
 「Import Maven projects automatically」をチェックして続⾏
  10. pom.xmlファイルを書き換えることでプロジェクトを設定できる。
 (ちなみに、pom:Project Object Modelの略らしい) .BWFOϓϩδΣΫτͷઃఆ <project> <groupId>...</groupId> <artifactId>...</artifactId> <version>...</version> <packaging>...</packaging>

    <dependencies>...</dependencies> <parent>...</parent> <dependencyManagement>...</dependencyManagement> <modules>...</modules> <properties>...</properties> <build>...</build> <reporting>...</reporting> ... </project> https://maven.apache.org/pom.html#What_is_the_POM プロジェクトの基本設定
 プロジェクト名やバージョン、
 組み込む外部ライブラリなど 実⾏時・パッケージング時の設定
  11. +BWBͷϓϩδΣΫτʹ͢Δ ɹ<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.1</version> <configuration> <source>1.8</source> <target>1.8</target>

    </configuration> </plugin> </plugins> </build> ⇒ Javaのソースコードとコンパイルの
   バージョンを1.8にする 書き換えたら、IDEでプロジェクトをビルドすると、Java8のプロジェクトになります。
  12. +6OJUͷϥΠϒϥϦΛมߋ͢Δ <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> </dependencies> ⇒ JUnitライブラリのバージョンを4.12にする

    書き換えたら、IDEでプロジェクトを
 ビルドすると...
 JUnitがバージョンアップして、
 Hamcrest(依存ライブラリ)が追加される!
  13. ςετΫϥεΛॻ͖׵͑Δ package com.example; import org.junit.Test; import static org.junit.Assert.assertTrue; public class

    AppTest { @Test public void testApp() { assertTrue(true); } } JUnit3のクラスから、JUnit4のクラスに書き換えて、テストを実⾏してみましょう。
  14. プロジェクトが依存する外部ライブラリの設定。
 <dependencies>タグの中に、ライブラリごとに<dependency>タグを
 列挙していく。 .BWFOͷEFQFOEFODZ <groupId> ⇒ ライブラリのグループ名(パッケージ名の場合も多い) <artifactId> ⇒ ライブラリ名
 <version> ⇒ バージョン番号


    <scope> ⇒ ライブラリが必要なタイミング dependencyで追加されるライブラリが他のライブラリを必要としている時、
 デフォルトではプロジェクトに⾃動的に導⼊される。
 (AというライブラリにBが必要であれば、プロジェクトにはAB両⽅⼊る)
  15. ⼀般的にdependencyに追加できる外部ライブラリは
 Maven Central Repositoryで公開されている。 mavenプロジェクトがコンパイルやパッケージングされる場合に、
 pom.xmlに記載されたdependencyの情報を元に、外部ライブラリに必要な
 データがリポジトリからローカルにダウンロードされ、利⽤できるようになる。 リポジトリの内容は https://search.maven.org/ や


    https://mvnrepository.com/ などから検索できる。 ダウンロード先(ローカルリポジトリ)は、
 デフォルトでは、ホームフォルダの.m2/repository に設定されている。 EFQFOEFODZͱϦϙδτϦ なんか調⼦が悪くなったら、.m2/repositoryを削除すると改善されたりする!
  16. mavenは、フェーズやゴール(プラグインの起動指⽰)で動作する。 たとえば… mvn オプション ゴール フェーズ mvn test 
 ⇒ コンパイルした後、プロジェクトをテストする(JUnit)

    mvn package 
 ⇒ コンパイル・テストした後に、jar(war)にプロジェクトをパッケージ mvn versions:display-dependency-updates
 ⇒ versionsプラグインを使って、ライブラリの更新状況を確認 ※フェーズの中でプラグインが必要な場合は、⾃動的に利⽤される ϑΣʔζͱΰʔϧ
  17. NWOUFTUͷྫ [INFO] Scanning for projects... [INFO] [INFO] ------------------------------------------------------------------------ [INFO] Building

    mvn-app 1.0 [INFO] ------------------------------------------------------------------------ [INFO] [INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ mvn-app --- [INFO] Using 'UTF-8' encoding to copy filtered resources. [INFO] skip non existing resourceDirectory /Users/jyukai/Dropbox/dev/sandbox/mvn-app/src/main/resources [INFO] [INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ mvn-app --- [INFO] Nothing to compile - all classes are up to date [INFO] [INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ mvn-app --- [INFO] Using 'UTF-8' encoding to copy filtered resources. [INFO] skip non existing resourceDirectory /Users/jyukai/Dropbox/dev/sandbox/mvn-app/src/test/resources [INFO] [INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ mvn-app --- [INFO] Nothing to compile - all classes are up to date [INFO] [INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ mvn-app --- [INFO] Surefire report directory: /Users/jyukai/Dropbox/dev/sandbox/mvn-app/target/surefire-reports フェーズに必要なプラグインの準 備

  18. NWOUFTUͷྫ ------------------------------------------------------- T E S T S ------------------------------------------------------- Running com.example.AppTest

    Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.117 sec Results : Tests run: 1, Failures: 0, Errors: 0, Skipped: 0 [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 2.340 s [INFO] Finished at: 2017-04-22T06:29:34+09:00 [INFO] Final Memory: 9M/155M [INFO] ------------------------------------------------------------------------ テストの結果を表⽰
  19. compile ⇒ プロジェクトのソースコードをコンパイルする test ⇒ テストフレームワーク(JUnitなど)を使って、コンパイルした
      ソースコードをテストする。(packageやdeployといったフェーズでも
      実⾏されるが、必須ではない) package ⇒ プロジェクトをコンパイルして、パッケージングする
        (jarやwarにして、運⽤可能にする)

    clean ⇒ compileやpackageに必要なtargetフォルダを削除(掃除)する install、deploy ⇒ installはローカルに、deployはリポジトリに
             プロジェクトを公開する。
             (他のプロジェクトのpom.xmlから呼び出せるようになる) ୅දతͳϑΣʔζͷछྨ
  20. NWOWFSTJPOTEJTQMBZEFQFOEFODZVQEBUFTͷྫ [INFO] Scanning for projects... [INFO] [INFO] ------------------------------------------------------------------------ [INFO] Building

    xxxx [INFO] ------------------------------------------------------------------------ [INFO] [INFO] --- versions-maven-plugin:2.2:display-dependency-updates (default-cli) @ xxxx --- [INFO] The following dependencies in Dependencies have newer versions: [INFO] ch.qos.logback:logback-classic ........................ 1.2.2 -> 1.2.3 [INFO] de.agilecoders.wicket.webjars:wicket-webjars .......... 0.5.5 -> 2.0.1 [INFO] org.apache.wicket:wicket-extensions ................ 7.6.0 -> 8.0.0-M5 [INFO] org.apache.wicket:wicket-guice ..................... 7.6.0 -> 8.0.0-M5 [INFO] org.eclipse.jetty.aggregate:jetty-all ... [INFO] 9.2.19.v20160908 -> 9.4.4.v20170414 [INFO] org.mockito:mockito-all ........................ 1.10.19 -> 2.0.2-beta [INFO] org.postgresql:postgresql ...................... 42.0.0 -> 42.0.0.jre7 [INFO] org.sql2o:sql2o ................................... 1.5.4 -> 1.6.0-RC3 [INFO] org.webjars:bootstrap ..................... 3.3.7-1 -> 4.0.0-alpha.6-1 [INFO] org.wicketstuff:wicketstuff-html5 .................. 7.6.0 -> 8.0.0-M5 [INFO] org.wicketstuff:wicketstuff-htmlcompressor ......... 7.6.0 -> 8.0.0-M5 ------------- dependencyのライブラリに
 新しいメジャーバージョンのものがあるか検索してくれる

  21. ݸਓతʹྑ͘࢖͏ϑΣʔζɾΰʔϧ ※個⼈の⾒解です mvn test ⇒ JUnitテスト mvn clean package ⇒ プロジェクトのパッケージング (何らかの事情でテストをスキップしたければ、-Dmaven.test.skip=trueや

     -DskipTests=trueをつけることも) mvn versions:display-dependency-updates ⇒ ライブラリの更新状況の把握。なんだかんだいって楽。 mvn jetty:run ⇒ Jettyサーバを使ったWebアプリケーションのテストに (最近は組み込みのjettyやtomcatを使ってIDEから起動する⽅が多い)
  22. 5XJUUFS4FSWJDFKBWBΛ࡞Δ package com.example; import twitter4j.Status; import twitter4j.Twitter; import twitter4j.TwitterException; import

    twitter4j.TwitterFactory; import twitter4j.conf.ConfigurationBuilder; import java.time.Instant; import java.time.ZoneId; import java.time.ZonedDateTime; public class TwitterService { private static final String TL_BROCK_FORMAT = "-----------------------\n%s:%s\n%s"; private Twitter twitter;
  23. 5XJUUFS4FSWJDFKBWBΛ࡞Δ public TwitterService() { ConfigurationBuilder cb = new ConfigurationBuilder(); cb.setDebugEnabled(true)

    .setOAuthConsumerKey("****") .setOAuthConsumerSecret("****") .setOAuthAccessToken("****") .setOAuthAccessTokenSecret("****"); twitter = new TwitterFactory(cb.build()).getInstance(); } OAuthConsumerKey, OAuthConsumerSecret, OAuthAccessToken, OAuthAccessTokenSecret ͸ ࣗ෼ͷTwitterΞΧ΢ϯτ͔Β࡞ͬͯɺࠩ͠ସ͑Δ
 ͜ͷαΠτ͕ࢀߟʹͳΓ·͢ɿhttps://syncer.jp/Web/API/Twitter/REST_API/
  24. 5XJUUFS4FSWJDFKBWBΛ࡞Δ public void printTimeline() throws TwitterException { String ldtStr =

    ZonedDateTime.now().toString(); System.out.println("Checked at:" + ldtStr); twitter.getHomeTimeline().stream() .map(this::toTLBlock) .forEach(System.out::println); } private String toTLBlock(Status status) { String userName = status.getUser().getName(); String text = status.getText(); Instant instant = status.getCreatedAt().toInstant(); ZonedDateTime zdt = instant.atZone(ZoneId.systemDefault()); return String.format(TL_BROCK_FORMAT, userName, text, zdt.toString()); } }
  25. 5XJUUFS"QQKBWBΛ࡞Δ package com.example; import twitter4j.TwitterException; public class TwitterApp { public

    static void main(String[] args) { TwitterService twitterService = new TwitterService(); try { twitterService.printTimeline(); } catch (TwitterException e) { e.printStackTrace(); } } }
  26. IDEでファイル実⾏する *%&্Ͱ5XJUUFS"QQΛ࣮ߦͯ͠ΈΔ Checked at:2017-04-22T10:06:59.112+09:00[Asia/Tokyo] ----------------------- 湾岸ミッドナイトセリフbot:今までもそう・・ そしてこれからも・・・・ Zはいつでもお前しだいだ、アキオ 2017-04-22T10:06:46+09:00[Asia/Tokyo] ----------------------- ⻄端律⼦:英語の壁ががががが 早く崩さねば…。出るに出れない…。 2017-04-22T10:06+09:00[Asia/Tokyo]

    ----------------------- ⾚ちゃん:ママが僕と遊んだ後にパパを⾒て「でかっ!」って⾔ってるwww 2017-04-22T10:05:31+09:00[Asia/Tokyo] ----------------------- 楽しい例⽂:As he had eaten nothing for days, he was all but dead. 彼は何⽇も⾷べていなかった ので、死んだも同然だった。 2017-04-22T10:05:31+09:00[Asia/Tokyo] ----------------------- うらがみ⛄:RT @CyanosMod: 今⽇の講義、「PCの電源をつけましょう!」とか⾔い出して「アカンPC初めまして⽤の 講義取ったか!?」と思ったけど次の⼀⾔が「好きなディストリビューションは何ですか?」だったから安⼼した。 2017-04-22T10:03:30+09:00[Asia/Tokyo]
  27. Error: A JNI error has occurred, please check your installation

    and try again Exception in thread "main" java.lang.NoClassDefFoundError: twitter4j/TwitterException at java.lang.Class.getDeclaredMethods0(Native Method) at java.lang.Class.privateGetDeclaredMethods(Class.java:2701) at java.lang.Class.privateGetMethodRecursive(Class.java:3048) at java.lang.Class.getMethod0(Class.java:3018) at java.lang.Class.getMethod(Class.java:1784) at sun.launcher.LauncherHelper.validateMainClass(LauncherHelper.java:544) at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:526) Caused by: java.lang.ClassNotFoundException: twitter4j.TwitterException at java.net.URLClassLoader.findClass(URLClassLoader.java:381) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ... 7 more NWOBQQΛύοέʔδϯάͯ͠࠶࣮ߦ 例外が発⽣する…
 ⇒ mavenで開発環境やビルド⼿順は整うが、パッケージングしてJavaが実⾏する場合は、
   mavenのことを知らない(twitterのライブラリが実⾏環境:クラスパスにない)
 ⇒ twitter-core.jarにクラスパスを通すか、実⾏可能jarを作る
  28. mvn-appのpom.xmlに、maven-assemble-pluginを⼊れる ࣮ߦՄೳKBSʢGBUKBSʣΛ࡞Δ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <archive>

    <manifest> <mainClass>com.example.TwitterApp</mainClass> </manifest> </archive> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin> ⇒ 実⾏⽤クラス ⇒ pachageフェーズで、プラグインのゴール”single”を
   実⾏する
  29. 最新のタイムラインが表⽰されてれば成功です! NWOBQQͷ࣮ߦՄೳKBSΛಈ͔͢ Checked at:2017-04-22T10:33:25.670+09:00[Asia/Tokyo] ----------------------- togetter_jp:.@Friendboy42さんの「「⽇本⼈は信⻑を化物にされたら怒らないのか?」→もうなってる」がホント すごい!えっまだチェックしてないって! https://t.co/biWJ15trBd ----------------------- 湾岸ミッドナイトセリフbot:今までもそう・・ そしてこれからも・・・・ Zはいつでもお前しだいだ、アキオ

    2017-04-22T10:06:46+09:00[Asia/Tokyo] ----------------------- ⻄端律⼦:英語の壁ががががが 早く崩さねば…。出るに出れない…。 2017-04-22T10:06+09:00[Asia/Tokyo] ----------------------- ⾚ちゃん:ママが僕と遊んだ後にパパを⾒て「でかっ!」って⾔ってるwww 2017-04-22T10:05:31+09:00[Asia/Tokyo] ----------------------- 楽しい例⽂:As he had eaten nothing for days, he was all but dead. 彼は何⽇も⾷べていなかった ので、死んだも同然だった。 2017-04-22T10:05:31+09:00[Asia/Tokyo]