pomで定義されているMavenプロパティにアクセスします


81

通常のMavenプロジェクトおよびMavenプラグインプロジェクトのpomで定義されているMavenプロパティにアクセスするにはどうすればよいですか?


1
どんな情報に興味がありますか?それが単なるバージョンまたは同様のものである場合は、マニフェスト入れてそこから読み取る方がおそらく良い考えです。
ヨアヒムザウアー2012

1
これについてはStackOverflowにたくさんの投稿があります:stackoverflow.com/search?q = read + pom + in + java、少なくとも、投稿する前に見てください。したがって、編集ヘルパーはそれらを表示する必要があります。グーグルも。
ジャン・レミーレヴィ

みんなありがとう。私は今、これは本当に悪い習慣だと気づきました。他のアプローチを試すつもりです。
SparedWhisle 2012

回答:


76

properties-maven-pluginを使用して、propertiesコンパイル時に特定のpomをファイルに書き込み、実行時にそのファイルを読み取ります。

あなたの中のpom.xml

<properties>
     <name>${project.name}</name>
     <version>${project.version}</version>
     <foo>bar</foo>
</properties>

<build>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>properties-maven-plugin</artifactId>
            <version>1.0.0</version>
            <executions>
                <execution>
                    <phase>generate-resources</phase>
                    <goals>
                        <goal>write-project-properties</goal>
                    </goals>
                    <configuration>
                        <outputFile>${project.build.outputDirectory}/my.properties</outputFile>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

そして、.javaで

java.io.InputStream is = this.getClass().getResourceAsStream("my.properties");
java.util.Properties p = new Properties();
p.load(is);
String name = p.getProperty("name");
String version = p.getProperty("version");
String foo = p.getProperty("foo");

それは機能しましたが、Eclipseを無限のビルド/デプロイからTomcatへのループ(ビルド-> my.propertiesの生成->リソースの変更->ビルド)に陥らせたため、フェーズをに変更する必要がありましたcompile。しかし、それが適切な解決策であるかどうかはわかりません。
Nikita Bosik 2016年

@atoregozhは、プロパティファイルをロードする代わりにGuavaResourceを使用することを提案しました。OK。ただし、標準APIでこの例を最小限に抑えるために、変更を元に戻しました。
Leif Gruenwoldt 2016年

2
安定した1.0.0バージョンが利用可能になりました
Pieter De Bie 2018年

25

Mavenからシステム変数を設定し、Javaで次の呼び出しを使用します

System.getProperty("Key");

7
これは、おそらくmaven-exec-pluginを使用して、Mavenから結果のビルドを実行している場合にのみ機能します。Mavenを使用してコードをコンパイルしているだけの場合、これは機能しません。
David Pashley 2015

@DavidPashley、それは本当です。コンパイルのみの場合、変数はコンパイラプラグインから設定する必要があると思います。
サントッシュ2015

7

これはmaven-resource-plugin、プロパティのフィルタリングを有効にした状態と組み合わせて、標準のJavaプロパティを使用して実行できます。

詳細については、http: //maven.apache.org/plugins/maven-resources-plugin/examples/filter.htmlを参照してください。

これは、プラグインプロジェクトと同様に標準のMavenプロジェクトでも機能します


6

Mavenには、必要なことを実行するためのソリューションがすでにあります。

POM.xmlからMavenProjectを取得します-pomパーサー?

ところで:グーグル検索で最初のヒット;)

Model model = null;
FileReader reader = null;
MavenXpp3Reader mavenreader = new MavenXpp3Reader();

try {
     reader = new FileReader(pomfile); // <-- pomfile is your pom.xml
     model = mavenreader.read(reader);
     model.setPomFile(pomfile);
}catch(Exception ex){
     // do something better here
     ex.printStackTrace()
}

MavenProject project = new MavenProject(model);
project.getProperties() // <-- thats what you need

1
ここでは、単一リンクの回答は推奨されていません(主に、リンク先のリソースがなくなると役に立たなくなる可能性があるためです)。少なくともここに投稿するためのリンクからの情報を要約する必要があります。
ヨアヒムザウアー2012

2
これは本当に非常に悪い習慣です。Mavenリソースプラグインを使用するだけです。
マークバッカー2012

1
彼がJavaコードからプロパティにアクセスしたいのなら、なぜこれは悪い習慣である必要がありますか?
SWoeste 2012

1
ただし、彼が自分のpomを変更したい/変更できると想定した場合に限ります。外部ファイルではなくpomファイルにプロパティを直接含めるのは悪いことかもしれないことに同意します。そのファイルは、Javaプロパティクラスで読み取ることができます-確かに。しかし、他の場合はどうでしょうか?次に、Mavenモデルがトリックを実行するための最良のソリューションです...しかし、David Daiが何をしたいのかを正確に教えてくれない前に、私たちは皆推測しているだけです。
SWoeste 2012

1
1つのmvnpomファイル(プロパティを含む)と1つのjavaアプリケーション(そこからそのpomファイルの詳細を読みたい)があることも私の理解でした。実際にMavenを実行せずに。
アンドレアスドルク2012

-4

JDOM(http://www.jdom.org/)を使用してpomファイルを解析できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.