GradleのマルチプロジェクトでJavaDocを一箇所にまとめて出力する
$ gradle init --type java-library
でいくつかプロジェクトを作って階層構造に並べなおす。
. ├── build.gradle ├── gradle │ └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── settings.gradle ├── suba │ ├── build.gradle │ ├── gradle │ │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ └── src │ ├── main │ │ └── java │ │ └── Library1.java │ └── test │ └── java │ └── LibraryTest.java ├── subb │ ├── build.gradle │ ├── gradle │ │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ └── src │ ├── main │ │ └── java │ │ └── Library2.java │ └── test │ └── java │ └── LibraryTest.java └── tree.txt 18 directories, 21 files
/* * This build file was auto generated by running the Gradle 'init' task * * This generated file contains a sample Java project to get you started. * For more details take a look at the Java Quickstart chapter in the Gradle * user guide available at https://docs.gradle.org/2.9/userguide/tutorial_java_projects.html */ // Apply the java plugin to add support for Java apply plugin: 'java' // In this section you declare where to find the dependencies of your project repositories { // Use 'jcenter' for resolving your dependencies. // You can declare any Maven/Ivy/file repository here. jcenter() } // In this section you declare the dependencies for your production and test code dependencies { // The production code uses the SLF4J logging API at compile time compile 'org.slf4j:slf4j-api:1.7.13' // Declare the dependency for your favourite test framework you want to use in your tests. // TestNG is also supported by the Gradle Test task. Just change the // testCompile dependency to testCompile 'org.testng:testng:6.8.1' and add // 'test.useTestNG()' to your build script. testCompile 'junit:junit:4.12' } buildscript { repositories { jcenter() } dependencies { classpath 'com.netflix.nebula:gradle-aggregate-javadocs-plugin:2.2.+' } } apply plugin: 'nebula-aggregate-javadocs'
/* * This settings file was auto generated by the Gradle buildInit task * * The settings file is used to specify which projects to include in your build. * In a single project build this file can be empty or even removed. * * Detailed information about configuring a multi-project build in Gradle can be found * in the user guide at https://docs.gradle.org/2.9/userguide/multi_project_builds.html */ /* // To declare projects as part of a multi-project build use the 'include' method include 'shared' include 'api' include 'services:webservice' //rootProject.name = 'subb' include 'suba' include 'subb'
$ gradle aggregateJavadocs :suba:compileJava :suba:processResources UP-TO-DATE :suba:classes :suba:javadoc :subb:compileJava :subb:processResources UP-TO-DATE :subb:classes :subb:javadoc :aggregateJavadocs BUILD SUCCESSFUL Total time: 9.984 secs This build could be faster, please consider using the Gradle Daemon: https://docs.gradle.org/2.9/userguide/gradle_daemon.html
$ tree . ├── build │ ├── docs │ │ └── javadoc │ │ ├── Library1.html │ │ ├── Library2.html │ │ ├── allclasses-frame.html │ │ ├── allclasses-noframe.html │ │ ├── constant-values.html │ │ ├── deprecated-list.html │ │ ├── help-doc.html │ │ ├── index-all.html │ │ ├── index.html │ │ ├── overview-tree.html │ │ ├── package-frame.html │ │ ├── package-list │ │ ├── package-summary.html │ │ ├── package-tree.html │ │ ├── script.js │ │ └── stylesheet.css │ └── tmp │ └── aggregateJavadocs │ └── javadoc.options ├── build.gradle ├── gradle │ └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── settings.gradle ├── suba │ ├── build │ │ ├── classes │ │ │ └── main │ │ │ └── Library1.class │ │ ├── dependency-cache │ │ ├── docs │ │ │ └── javadoc │ │ │ ├── Library1.html │ │ │ ├── allclasses-frame.html │ │ │ ├── allclasses-noframe.html │ │ │ ├── constant-values.html │ │ │ ├── deprecated-list.html │ │ │ ├── help-doc.html │ │ │ ├── index-all.html │ │ │ ├── index.html │ │ │ ├── overview-tree.html │ │ │ ├── package-frame.html │ │ │ ├── package-list │ │ │ ├── package-summary.html │ │ │ ├── package-tree.html │ │ │ ├── script.js │ │ │ └── stylesheet.css │ │ └── tmp │ │ ├── compileJava │ │ │ └── emptySourcePathRef │ │ └── javadoc │ │ └── javadoc.options │ ├── build.gradle │ ├── gradle │ │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ └── src │ ├── main │ │ └── java │ │ └── Library1.java │ └── test │ └── java │ └── LibraryTest.java ├── subb │ ├── build │ │ ├── classes │ │ │ └── main │ │ │ └── Library2.class │ │ ├── dependency-cache │ │ ├── docs │ │ │ └── javadoc │ │ │ ├── Library2.html │ │ │ ├── allclasses-frame.html │ │ │ ├── allclasses-noframe.html │ │ │ ├── constant-values.html │ │ │ ├── deprecated-list.html │ │ │ ├── help-doc.html │ │ │ ├── index-all.html │ │ │ ├── index.html │ │ │ ├── overview-tree.html │ │ │ ├── package-frame.html │ │ │ ├── package-list │ │ │ ├── package-summary.html │ │ │ ├── package-tree.html │ │ │ ├── script.js │ │ │ └── stylesheet.css │ │ └── tmp │ │ ├── compileJava │ │ │ └── emptySourcePathRef │ │ └── javadoc │ │ └── javadoc.options │ ├── build.gradle │ ├── gradle │ │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ └── src │ ├── main │ │ └── java │ │ └── Library2.java │ └── test │ └── java │ └── LibraryTest.java └── tree.txt 43 directories, 72 files
Spring Boot でプロパティファイルを外部ファイル化する
プロパティファイルを外部ファイル化したい。
さらにファイル名に application.properties は使えないという条件。
Application.java
package hello; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.MessageSource; @SpringBootApplication public class Application implements CommandLineRunner { @Autowired GreedInterface greedInterface; @Autowired MessageSource messageSource; public static void main(String[] args) throws Exception { SpringApplication application = new SpringApplication(Application.class); application.setShowBanner(false); application.run(args); } @Override public void run(String... args) throws Exception { System.out.println(greedInterface.greed()); } }
GreedInterface.java
package hello; public interface GreedInterface { public String greed(); }
HelloService.java
package hello.impl; import hello.GreedInterface; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.PropertySource; import org.springframework.stereotype.Service; @PropertySource("${spring.config.basepath}") @Service public class HelloService implements GreedInterface { @Value("${message}") private String message; @Override public String greed() { return message; } }
src/main/resources/default.properties
message=default
../../override/override.properties
message=override
jar実行
$ java -jar spring-boot-value-0.1.0.jar --spring.config.basepath=classpath:default.properties default
jar実行
$ java -jar spring-boot-value-0.1.0.jar --spring.config.basepath=file:../override/override.properties override
Sprig BootでProfile切り替え
Springの起動引数でBeanを切り替えたい
切り替え対象のBeanが実装するインターフェース
package hello; public interface GreedInterface { public String greed(); }
実装クラス。@Profileアノテーションで切り替えに使うプロファイル名を指定する。
package hello.impl; import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Service; import hello.GreedInterface; @Profile("hello") @Service public class HelloService implements GreedInterface { @Override public String greed() { return "hello"; } }
package hello.impl; import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Service; import hello.GreedInterface; @Profile("hi") @Service public class HiService implements GreedInterface { @Override public String greed() { return "Hi"; } }
呼び出し側のメインクラス。GreedInterfaceをAutowireする。
package hello; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class Application implements CommandLineRunner { @Autowired GreedInterface greedInterface; public static void main(String[] args) throws Exception { SpringApplication application = new SpringApplication(Application.class); application.setShowBanner(false); application.run(args); } @Override public void run(String... args) throws Exception { System.out.println(greedInterface.greed()); } }
application.propertiesにデフォルトのプロファイル名を指定する。
spring.profiles.active=hello
実行時に起動引数でプロファイルを変える。
$ java -jar gs-spring-boot-0.1.0.jar --spring.profiles.active=hi Hi $ java -jar gs-spring-boot-0.1.0.jar --spring.profiles.active=hello hello
exportする環境変数をファイル経由で読み込む
環境
- Ubuntu 14.04
やりたいこと
- シェルを実行するときにexportする環境変数を別ファイルにする
- 別ファイルはシェルで動的に生成する
動的にexport文を作るシェルは割愛
出力イメージ
send.txt
export HOGE_PATH='send_path' export HOGE_NAME='send_name'
受け取る側の親シェル
root.sh
#!/bin/bash export FILE_PATH=send.txt ./receive.sh
受け取ったことを確認するシェル
receive.sh
#!/bin/bash . ${FILE_PATH} echo ${HOGE_PATH} echo ${HOGE_NAME}
kcovでbashシェルスクリプトのカバレッジを計測する
http://simonkagstrom.github.io/kcov/
環境
- Centos6.2
インストール
# yum install cmake $ mkdir kcov $ cd kcov $ wget https://github.com/SimonKagstrom/kcov/archive/v26.tar.gz $ tar xvzf v26.tar.gz $ cd kcov-26 $ cd kcov-26 $ mkdir build $ cd build $ cmake ..
エラー
-- The CXX compiler identification is unknown CMake Error: your CXX compiler: "CMAKE_CXX_COMPILER-NOTFOUND" was not found. Please set CMAKE_CXX_COMPILER to a valid compiler path or name. CMake Error: your CXX compiler: "CMAKE_CXX_COMPILER-NOTFOUND" was not found. Please set CMAKE_CXX_COMPILER to a valid compiler path or name. CMake Error at /usr/share/cmake/Modules/FindPackageHandleStandardArgs.cmake:108 (message): Could NOT find LibElf (missing: LIBELF_LIBRARIES LIBELF_INCLUDE_DIRS) Call Stack (most recent call first): /usr/share/cmake/Modules/FindPackageHandleStandardArgs.cmake:315 (_FPHSA_FAILURE_MESSAGE) cmake/FindLibElf.cmake:50 (FIND_PACKAGE_HANDLE_STANDARD_ARGS) src/CMakeLists.txt:6 (find_package) -- Configuring incomplete, errors occurred!
続・Common Printing Dialog をビルドしてみた。 - なるひこの Linux Printing お勉強日記
G++を入れる
# yum install gcc-c++ $ cmake ..
まだだめ
$ cmake .. -- The CXX compiler identification is GNU 4.4.7 -- Check for working CXX compiler: /usr/bin/c++ -- Check for working CXX compiler: /usr/bin/c++ -- works -- Detecting CXX compiler ABI info -- Detecting CXX compiler ABI info - done CMake Error at /usr/share/cmake/Modules/FindPackageHandleStandardArgs.cmake:108 (message): Could NOT find LibElf (missing: LIBELF_LIBRARIES LIBELF_INCLUDE_DIRS) Call Stack (most recent call first): /usr/share/cmake/Modules/FindPackageHandleStandardArgs.cmake:315 (_FPHSA_FAILURE_MESSAGE) cmake/FindLibElf.cmake:50 (FIND_PACKAGE_HANDLE_STANDARD_ARGS) src/CMakeLists.txt:6 (find_package) -- Configuring incomplete, errors occurred!
# yum install elfutils-libelf-devel $ cmake ..
まだだめ
$ cmake .. -- Found LibElf: /usr/lib64/libelf.so -- Could NOT find ElfUtils (missing: LIBDW_LIBRARIES LIBDW_INCLUDE_DIR) -- checking for module 'zlib' -- package 'zlib' not found CMake Error at /usr/share/cmake/Modules/FindPkgConfig.cmake:279 (message): A required package was not found Call Stack (most recent call first): /usr/share/cmake/Modules/FindPkgConfig.cmake:333 (_pkg_check_modules_internal) src/CMakeLists.txt:8 (pkg_check_modules) -- checking for module 'libcurl' -- package 'libcurl' not found CMake Error at /usr/share/cmake/Modules/FindPkgConfig.cmake:279 (message): A required package was not found Call Stack (most recent call first): /usr/share/cmake/Modules/FindPkgConfig.cmake:333 (_pkg_check_modules_internal) src/CMakeLists.txt:9 (pkg_check_modules)
# yum install zlib-devl # yum install libcurl # yum install elfutils-devel # yum install libcurl-devel
成功
$ make # make install
はてなダイアリーでソースコードを書く
はてなダイアリーでプログラミングコードを載せたい - by shigemk2
はてなブログにソースコードを貼り付ける方法 - くりにっき
みんな有料オプションを使っているんだと思っていた。
ちゃんとドキュメントを読むべきだった。
過去の日記も直すか悩む。
shunit2でテストコードを書いてみる
Google Code Archive - Long-term storage for Google Code Project Hosting.
インストール
$ mkdir shunit2 $ wget https://shunit2.googlecode.com/files/shunit2-2.1.6.tgz $ tar zxvf shunit2-2.1.6.tgz
./shunit2/shunit2-2.1.6
テストファイル
./shunit2/shunit2-2.1.6 ./shunit2/sample |--first.sh |--firstTest.sh |--test | |--hello | |--hoge
テスト対象のコード
first.sh
#!/bin/bash function helloWorld() { echo 'Hello World!' }
テストコード
firstTest.sh
#!/bin/bash # テストのセットアップ。標準出力をリダイレクトするファイルを用意する。今回のテストでは用意しなくても動く。 setup() { touch ./test/hello } # テスト結果の整理。リダイレクトしたファイルを削除する。 tearDown() { touch ./test/hoge } # テスト対象スクリプトを読み込む . first.sh # テスト関数。testを名称の初めにつける。 testHelloWorld() { # テスト対象を読んでリダイレクトする helloWorld > ./test/hello # 関数の戻りが0であることを確認する assertEquals $? 0 # 出力結果を変数に入れる actual=`cat ./test/hello` # 変数と期待値を比較する assertEquals "${actual}" 'Hello World!' } # shunit2を読み込む . ../shunit2-2.1.6/src/shunit2
テスト実行
$ ./firstTest.sh testHelloWorld Hello World! Ran 1 test. OK