maven – こみなのメモ帳 / 趣味と実益のネタ帳 Tue, 16 Feb 2021 13:45:00 +0000 ja hourly 1 https://wordpress.org/?v=6.1.1 [play1-deps] libフォルダについて /archives/708/ /archives/708/#respond Tue, 16 Feb 2021 13:45:00 +0000 https://www.komina.info/?p=708 libフォルダは置かれたjarを勝手に認識してくれる便利なフォルダですが、本来は play deps コマンドで依存性解決した結果のライブラリの置き場所です。

そのため、playが置いた以外のjarファイルが見つかるとwarningが表示されます。うっかり、play deps--syncオプション付きで実行してしまうと削除されてしまいます。

つまり、libフォルダへは手動でjarを配置せず、playが認知するようにdependencies.ymlにしっかり記述するのが本来あるべき姿ということです。

一般配布されていなかったり、maven非対応のjarを解決させる際には、ローカルレポジトリを定義し、そこにjarを置いた上で play deps を実行。playにlibフォルダへ置かせる流れになります。

    require:
        - play 1.3.0
        - localLibrary -> ibatis 2.3.0.677
        - localLibrary2 -> ojdbc5_g latest.integration
        - localLibrary3 -> mymodule 0.1
    
    
    repositories:
    # jar with revision
        - local_library:
            type:       local
            artifact:   ${application.path}/local_repo/[module]-[revision].jar
            contains:
                - localLibrary -> *
    
    # jar with no revsion
        - local_library2:
            type:       local
            artifact:   ${application.path}/local_repo/[module].jar
            contains:
                - localLibrary2 -> *
    
    # play module
        - local_library3:
            type:       local
            artifact:   ${application.path}/local_repo/[module]-[revision].zip
            contains:
                - localLibrary3

プロジェクト内に、/local_repoというフォルダを用意してローカルレポジトリとして定義して います。

リビジョン指定ありの場合を local_library
リビジョン指定無しの場合を local_library2。自作のplay-moduleを local_library3 と定義。(もっと良い記述方法があるかもしれないです)

こうしておくと play deps コマンドの実行により、local_repoフォルダから必要なjarファイル がlibファイルへコピーされプロジェクトに組み込まれるようになります。

自作のplayモジュール(zip形式)については、local_repo配下にビルド結果のzipファイ ルを置きます。すると、/modules 配下にフォルダが作られてモジュール資材が解凍する形で解決となります。

]]>
/archives/708/feed/ 0
GroovyでMavenで単一の配布可能なjar作成 (4) /archives/506/ /archives/506/#respond Sat, 31 Oct 2020 21:00:51 +0000 https://www.komina.info/?p=506 これまでは依存したすべてのjarを一つにまとめた fat-jar を作成する方向性でした。そのため、配布された側は自分でjavaコマンドを実行する必要がありました。

windows向けバッチやunix向けスクリプトを生成してくれるプラグインがあることを知ったので、それを適用してみることにしました。

ツールを利用する側はjarの実行の仕方なんか興味ないわけで、やはり即実行可能なバッチやスクリプトの形であるに越したことないですもんね。

Maven でアプリケーション実行用バッチファイルを作る – A Memorandum

https://blog1.mammb.com/entry/20101206/1291619754

まず、fat-jarが不要になるので、project>build>plugins内のmaven-assembly-pluginの定義は削除します。

<!-- fat-jarが不要になるので、maven-assembly-pluginの定義は削除
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-assembly-plugin</artifactId>
        <executions>
            <execution>
                <phase>package</phase>
                <goals>
                    <goal>single</goal>
                </goals>
            </execution>
        </executions>
        <configuration>
            <descriptorRefs>
                <descriptorRef>jar-with-dependencies</descriptorRef>
            </descriptorRefs>
            <archive>
                <manifest>
                    <mainClass>MediaRqstGetter</mainClass>
                </manifest>
            </archive>
        </configuration>
    </plugin>
-->

代わりに project>dependencies内にappassembler-maven-pluginの依存定義に追加します。

<!-- dependencies -->
        <!-- https://mvnrepository.com/artifact/org.codehaus.mojo/appassembler-maven-plugin -->
        <dependency>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>appassembler-maven-plugin</artifactId>
            <version>2.1.0</version>
        </dependency>

次に project>build>plugins配下に appassembler-maven-pluginの処理の定義を記述します。
シンプルな実行スクリプトの他に、デーモン(Javaで作ったサービス)のラッパーやなんかもサポートしているみたいですが、今回は単純な方で。

    <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>appassembler-maven-plugin</artifactId>
        <configuration>
            <programs>
                <program>
                    <mainClass>info.komina.MyApp</mainClass>
                    <id>runapp</id>
                </program>
            </programs>
            <binFileExtensions>
                <unix>.sh</unix>
                <windows>.cmd</windows>
            </binFileExtensions>
            <repositoryName>lib</repositoryName>
            <repositoryLayout>flat</repositoryLayout>
            <useWildcardClassPath>true</useWildcardClassPath>
            <environmentSetupFileName>setenv</environmentSetupFileName>
            <includeConfigurationDirectoryInClasspath>false</includeConfigurationDirectoryInClasspath>
        </configuration>
        <executions>
            <execution>
                <goals>
                    <goal>assemble</goal>
                </goals>
                <phase>package</phase>
            </execution>
        </executions>
    </plugin>
configulationタグ説明
programs>program>mainClass実行クラスを完全修飾で指定
programs>program>idスクリプトの名前になります
binFileExtensions任意。生成するスクリプトの拡張子をプラットフォーム毎に指定します。デフォルトでunixは無し、windowsはbatです。
repositoryName任意。依存するjarを配置するフォルダ名です。デフォルトは/repoです。
repositoryLayout任意。依存するjarの置き方です。デフォルトは階層構造です。ここでは階層構造だとクラスパスの文字列長が長くなり問題が起きるので、useWildcardClassPathのtrue設定と合わせてflat指定しています。
useWildcardClassPath任意。クラスパスでワイルドカードを使用するかの設定。デフォルトはfalseです。
environmentSetupFileName任意。環境設定用スクリプトの名前です。生成されるスクリプトを実行する際にファイルが存在すれば呼び出されます。
includeConfigurationDirectoryInClasspath任意。コンフィグファイル用のディレクトリをクラスパスに含める機能がありますが今回は不要なのでfalseにしています。

ここで環境設定用スクリプトという言葉が出てきますが、これは生成されるスクリプトを実行時に呼び出されるユーザ定義のスクリプトのことです。

細かい制御をしたいとき、追加で環境変数を設定したいとき、などに利用できます。もちろんunix/windows必要なスクリプトを自分で用意しなければなりません。

環境設定用スクリプトは生成されるスクリプトと同じフォルダに置かれている必要がありますが、mavenの出力先はcleanなどの実行でしょっちゅう削除される場所ですので、別の場所からビルドのたびにコピーを行います。

ファイルのコピーはantプラグインにやらせるのが簡単ですので、maven-antrun-plugin定義に下記処理を追加します。

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-antrun-plugin</artifactId>
        <executions>
            :
            <execution>
                <goals>
                    <goal>run</goal>
                </goals>
                <phase>package</phase>
                <configuration>
                    <tasks>
                        <echo message="copy files for appassembler"/>
                        <copy toDir="${build.directory}/appassembler/bin" overwrite="yes">
                            <fileset dir="${basedir}/resources-appassembler" />
                        </copy>
                    </tasks>
                </configuration>
            </execution>
        </executions>
    </plugin>

これでpackage処理の際に/resources-appassembler配下に置いたファイルが /target/appassembler/bin 配下にコピーされるようになります。

/target/appassembler配下のファイルをまとめて配布することで、javaやgroovyで作ったプログラムを簡単に実行できる形で提供できます。

あ、unixのスクリプトについてはchmodで実行属性を付けるのを忘れずに。(環境設定用スクリプトの方は付けなくても大丈夫でした)

以上です。

参考

Appassembler :: Maven Plug-In – appassembler:assemble
(設定についての説明)

https://www.mojohaus.org/appassembler/appassembler-maven-plugin/assemble-mojo.html

Mavenのappassembler-maven-pluginでJAVA_HOMEを設定する方法 – Qiita

https://qiita.com/Rozsa777/items/a44b88a6daf8e1fc98e7

Re: [mojo-user] Appassembler-maven-plugin JAVA_HOME question

https://www.mail-archive.com/user@mojo.codehaus.org/msg03990.html

https://www.komina.info/archives/482
]]>
/archives/506/feed/ 0
GroovyでMavenで単一の配布可能なjar作成 (3) /archives/482/ /archives/482/#respond Wed, 14 Oct 2020 06:41:55 +0000 https://www.komina.info/?p=482 タイトルとは少しずれてきましたが、WSDLからjavaソースを生成するというレアなタスクをmavenで対応できたのでメモしておきます。

もともとのプロジェクトではantビルドでexecタスクからバッチファイルを実行していました。

	<target name="wsdl_to_java">
		<exec dir="./jaxb" executable="cmd">
			<arg line="/c wsdlToJava.bat ../${SRC_DIR} ../${WSDL_FILE}"/>
		</exec>
	</target>
set LIB_HOME=.
set JAXB_LIBS=%LIB_HOME%\jaxb-api.jar
set JAXB_LIBS=%JAXB_LIBS%;%LIB_HOME%\jaxb-xjc.jar
set JAXB_LIBS=%JAXB_LIBS%;%LIB_HOME%\jaxb-impl.jar

java -Dfile.encoding=UTF-8 -cp %JAXB_LIBS% com.sun.tools.xjc.XJCFacade -d %1 %2 -b custom-binding.xml -wsdl -target 2.1

こんな感じです。

既にgroovyをコンパイルするために maven-antrun-plugin プラグインを導入済ですので、ここへタスクを追加します。

生成されるjavaソースはgroovy側から参照するので、groovyのコンパイルより前にタスクを追加します。

バッチファイルにはなっていますが、Ant:java プログラムなので javaタスクを使用します。実行に必要なjarは諸般の理由で java6フォルダからプロジェクトの/toolsフォルダへコピーしてあります。

<tasks>
    <java classname="com.sun.tools.xjc.XJCFacade"
        classpath="${basedir}/tools/jaxb-api.jar;
                   ${basedir}/tools/jaxb-xjc.jar;
                   ${basedir}/tools/jaxb-impl.jar;" >
        <sysproperty key="file.encoding" value="UTF-8" />
        <arg value="-d" />
        <arg value="${basedir}/src/main/java"/>
        <arg value="${basedir}/src/main/WSDL/xxxx/xxxx_External.wsdl"/>
        <arg value="-b"/>
        <arg value="${basedir}/tools/custom-binding.xml"/>
        <arg value="-wsdl"/>
        <arg value="-target"/>
        <arg value="2.1"/>
    </java>
    <mkdir dir="${basedir}/src/main/groovy" />
    <taskdef name="groovyc"
        classname="org.codehaus.groovy.ant.Groovyc">
  続く

/src/main/java へ生成されたjavaソースが出力されます。コンパイルについては記述の必要はなかったです。

参考にしたサイト

Ant「javaタスク」メモ(Hishidama’s ant-java Memo)

https://www.ne.jp/asahi/hishidama/home/tech/ant/tag/java.html

]]>
/archives/482/feed/ 0
GroovyでMavenで単一の配布可能なjar作成 (2) /archives/470/ /archives/470/#respond Mon, 12 Oct 2020 08:04:26 +0000 https://www.komina.info/?p=470 前回で配布可能なjar作成については解決したかと思ったのですが、またまた問題が発生。解決に至れましたのでメモしておきます。

そもそも、こういった依存するライブラリをすべて含めた配布可能な単一のjarのことをfat-jarと呼ぶそうです。検索するときは fatjar で調べると有用な情報が見つかります。

さてどんな問題が起きたかなんですが、mavenレポジトリに置いてないようなライブラリ(ojdbc.jar、マイナーなjar、個人的なjarなど)の場合、dependenciesには以下のように <scope>system</scope> とし、配置場所を<systemPath>タグでダイレクトに指定します。(プロジェクトディレクトリを参照すると警告が出ちゃうけど気にせずに)

Mavenでローカルjarを追加する

https://qiita.com/inuDrill/items/bd2843e812016a3a900b
        <dependency>
            <groupId>com.oracle.jdbc</groupId>
            <artifactId>ojdbc</artifactId>
            <version>1</version>
            <scope>system</scope>
            <systemPath>${basedir}/lib/ojdbc6_g.jar</systemPath>
        </dependency>

これでコンパイルしたりする分には十分なのですが、これらのライブラリはjar-with-dependenciesの対象外となっているため、このままではfatjarは作れません。

そこで maven-dependency-plugin というプラグイン定義を追加します。

            <!-- https://maven.apache.org/plugins/maven-dependency-plugin/usage.html -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <executions>
                    <execution>
                        <phase>prepare-package</phase>
                        <goals>
                            <goal>unpack-dependencies</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>${project.build.directory}/classes</outputDirectory>
                            <includeArtifactIds>ojdbc</includeArtifactIds>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

こうすることで、systemライブラリがclasses配下に展開され、まとめてjar作成されるようになります。

参考

Maven Dependency Plugin で system スコープの jar ファイルもひとつにまとめる

https://qiita.com/niwasawa/items/766ba558678ac9bb85aa

Apache Maven Dependency Plugin – Usage

https://maven.apache.org/plugins/maven-dependency-plugin/usage.html

https://www.komina.info/archives/482
次へ
]]>
/archives/470/feed/ 0
GroovyでMavenで単一の配布可能なjar作成 /archives/382/ /archives/382/#respond Thu, 01 Oct 2020 09:02:53 +0000 https://www.komina.info/?p=382 Groovyには自前でライブラリ解決する機能があります。インターネットに接続されている環境であれば、スクリプトを実行時に足りないライブラリをダウンロードして解決するところまでやってくれます。(@Grabや@Grapes)

それはそれで超便利なのですが、企業内で開発などしているとインターネット接続を制限されている状況も少なくないです。せっかくGroovyで補助ツールなどを書いても、ネット接続が制限される実行環境では使えない、使いにくい、ということも。

そこでGroovyでプログラムを書きつつ、依存するライブラリを同梱した実行可能jarを作成する、というのをMavenプロジェクトでやってみました(ちなみにMaven初心者です)。せっかくなのでメモを残しておこうと思います。

<?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.nttd-teranos.teranos5.websh</groupId>
    <artifactId>groovy-maven-sample</artifactId>
    <version>1.0-SNAPSHOT</version>
    <name>groovyでmavenのサンプル</name>
    <packaging>jar</packaging>
    <description>groovyでmavenのサンプル</description>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <java.version>1.6</java.version>
    </properties>

    <build>
        <plugins>
            <!-- Antプラグインでコンパイルする -->
            <plugin>
                <groupId>info.komina</groupId>
                <artifactId>maven-antrun-plugin</artifactId>
                <executions>
                    <execution>
                        <id>compile</id>
                        <phase>compile</phase>
                        <configuration>
                            <tasks>
                                <mkdir dir="${basedir}/src/main/groovy" />
                                <taskdef name="groovyc"
                                         classname="org.codehaus.groovy.ant.Groovyc">
                                    <classpath refid="maven.compile.classpath"/>
                                </taskdef>
                                <mkdir dir="${project.build.outputDirectory}" />
                                <groovyc destdir="${project.build.outputDirectory}"
                                         srcdir="${basedir}/src/main/groovy/"
                                         listfiles="true">
                                    <classpath refid="maven.compile.classpath" />
                                </groovyc>
                            </tasks>
                        </configuration>
                        <goals>
                            <goal>run</goal>
                        </goals>
                    </execution>
                    <execution>
                        <id>test-compile</id>
                        <phase>test-compile</phase>
                        <configuration>
                            <tasks>
                                <mkdir dir="${basedir}/src/test/groovy" />
                                <taskdef name="groovyc"
                                         classname="org.codehaus.groovy.ant.Groovyc">
                                    <classpath refid="maven.test.classpath"/>
                                </taskdef>
                                <mkdir dir="${project.build.testOutputDirectory}" />
                                <groovyc destdir="${project.build.testOutputDirectory}"
                                         srcdir="${basedir}/src/test/groovy/"
                                         listfiles="true">
                                    <classpath refid="maven.test.classpath" />
                                </groovyc>
                            </tasks>
                        </configuration>
                        <goals>
                            <goal>run</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <!-- 依存関係をまとめた実行可能jarを作成する -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                    <archive>
                        <manifest>
                            <!-- 実行するクラスを指定する -->
                            <mainClass>App1</mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
            <!-- テスト時の文字化け対策 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.12.4</version>
                <configuration>
                    <junitArtifactName>junit:junit</junitArtifactName>
                    <argLine>-Dfile.encoding=UTF-8</argLine>
                    <skipTests>false</skipTests>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <dependencies>
        <!-- 使用するバージョンのGroovyを指定する -->
        <dependency>
            <groupId>org.codehaus.groovy</groupId>
            <artifactId>groovy-all</artifactId>
            <version>2.4.20</version>
        </dependency>
        <!-- Groovyでテストを記述する用 -->
        <dependency>
            <groupId>org.spockframework</groupId>
            <artifactId>spock-core</artifactId>
            <version>1.3-groovy-2.4</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>
./src/main/groovy主処理のスクリプトを置く場所。
./src/test/groovyテスト用のスクリプトを置く場所。
./target/コンパイルすると自動作成されるフォルダ。コンパイル結果やjarはここに出力される。
フォルダ構成

下記コマンドで、コンパイル、テスト、jar作成まで行ってくれます。

> maven package

出来上がったjarは下記のようにして実行します。

> java -jar groovy-maven-sample-1.0-SNAPSHOT-jar-with-dependencies.jar

Mavenでのコンパイルについては下記サイトを参照しました。

The Apache Groovy programming language – groovyc – the Groovy compiler
5. Maven integration

https://groovy-lang.org/groovyc.html

依存しているライブラリを同梱した実行可能jarの作り方は下記サイトを参考にしました。

Mavenで実行可能なJARファイルを作成

https://yhayashi30.org/java/maven-create-jar-file/

Groovyのテスト方法については下記サイト。

mavenプロジェクトでJUnitとSpockを実行する | BLOG TRECH

https://blog.trech.co.jp/maven%e3%83%97%e3%83%ad%e3%82%b8%e3%82%a7%e3%82%af%e3%83%88%e3%81%a7junit%e3%81%a8spock%e3%82%92%e5%ae%9f%e8%a1%8c%e3%81%99%e3%82%8b/

ユニットテスト – Apache Groovyチュートリアル

https://koji-k.github.io/groovy-tutorial/unit-test/index.html

The Apache Groovy programming language – Testing guide

https://groovy-lang.org/testing.html#_testing_with_spock


]]>
/archives/382/feed/ 0