2013年9月14日土曜日

Mavenでwarなプロジェクトからjarを作る

同僚にやってもらったことをブログに書く簡単なお仕事。

やりたいこと

warなプロジェクト(Webアプリケーション)を別のプロジェクトから使うため、WebアプリケーションなんだけどMavenでjarファイルを生成したい。

  • example-web
  • example-admin

のように2つのプロジェクトがあって、「example-webにあるクラスをexample-adminからも使いたい!」みたいな。

なお、使用するMavenは3.0.x以上を想定している。

pom.xml

pom.xml上では

<packaging>war</packaging>

のように通常のwarのプロジェクトとして定義するが、以下のmaven-jar-pluginをbuildpluginsに足すことで maven packageコマンドでwarファイルとともにjarファイルが生成されるようになる。

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>2.4</version>
                <executions>
                    <execution>
                        <id>make-a-jar</id>
                        <phase>compile</phase>
                        <goals>
                            <goal>jar</goal>
                        </goals>
                        <configuration>
                            <excludes>
                                <exclude>**/*.xml</exclude>
                                <exclude>**/*.properties</exclude>
                                <exclude>**/SampleController*</exclude>
                            </excludes>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

↑のようにconfigurationでjarパッケージング時に除外するファイルや逆にインクルードするファイルを指定することができる。

やってみよう。

$ mvn package
...
$ ls -l target/war-jar-sample.*
-rw-r--r--  1 kazuhiro  staff     3535  9 14 03:06 target/war-jar-sample.jar
-rw-r--r--  1 kazuhiro  staff  3842928  9 14 03:06 target/war-jar-sample.war

ちゃんとjarファイルができている。

mvn installしたい

生成したjarファイルをローカルマシンのMavenリポジトリ(~/.m2/repository)に配置したい場合はmaven-install-pluginを追加する。

           <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-install-plugin</artifactId>
                <version>2.4</version>
                <executions>
                    <execution>
                        <phase>install</phase>
                        <goals>
                            <goal>install-file</goal>
                        </goals>
                        <configuration>
                            <packaging>jar</packaging>
                            <artifactId>${project.artifactId}</artifactId>
                            <groupId>${project.groupId}</groupId>
                            <version>${project.version}</version>
                            <file>${project.build.directory}/${project.artifactId}.jar</file>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

やってみよう。

$ mvn install
...
$ ls -l ~/.m2/repository/net/lampetty/war-jar-sample/1.0.0-SNAPSHOT
total 7552
-rw-r--r--  1 kazuhiro  staff      234  9 14 03:09 _maven.repositories
-rw-r--r--  1 kazuhiro  staff      876  9 14 03:09 maven-metadata-local.xml
-rw-r--r--  1 kazuhiro  staff     3535  9 14 03:09 war-jar-sample-1.0.0-SNAPSHOT.jar
-rw-r--r--  1 kazuhiro  staff     7045  9 14 03:06 war-jar-sample-1.0.0-SNAPSHOT.pom
-rw-r--r--  1 kazuhiro  staff  3842926  9 14 03:09 war-jar-sample-1.0.0-SNAPSHOT.war```

ちゃんとjarファイルが ~/.m2/repository にできている。

mvn deployしたい

同様にリモートのMavenリポジトリにdeployしたい場合は以下のmaven-deploy-pluginプラグインを追加する。

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-deploy-plugin</artifactId>
                <version>2.7</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>deploy-file</goal>
                        </goals>
                        <configuration>
                            <packaging>jar</packaging>
                            <generatepom>true</generatepom>
                            <repositoryid>snapshots</repositoryid>
                            <url>${project.distributionManagement.snapshotRepository.url}</url>
                            <artifactId>${project.artifactId}</artifactId>
                            <groupId>${project.groupId}</groupId>
                            <version>${project.version}</version>
                            <file>${project.build.directory}/${project.artifactId}.jar</file>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

まとめ

最終的に出来上がったpom.xmlはhttps://github.com/oinume/war-jar-sample/ に上げてあるので、実際に試してみると良いでしょう。


Srirangan

アスキー・メディアワークス

売り上げランキング: 134,948

0 件のコメント: