GradleのマルチプロジェクトでJavaDocを一箇所にまとめて出力する

GitHub - nebula-plugins/gradle-aggregate-javadocs-plugin: Provides the ability to aggregate Javadocs across all projects in a multi-project build.
を使う

$ 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する環境変数をファイル経由で読み込む

環境

やりたいこと

  • シェルを実行するときに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 


テスト対象
shunit2でテストコードを書いてみる - 試したこととか困ったこととか

はてなダイアリーでソースコードを書く

はてなダイアリーでプログラミングコードを載せたい - 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