私はアーキタイプを作成していて、現在の日付とすべての小文字のアーティファクトIDのようなものを含むプロジェクト全体の利用可能なプロパティを作成したいとします。私はthe following post on Stackoverflowを見つけました。これは、それが通常どのように可能であるべきかを示しています。archetype mavenプロジェクトのダイナミックベロシティプロパティを設定する
私はそうのような原型-のmetadata.xmlにこれを追加してみました:
...
<requiredProperty key="artifactIdLower">
<defaultValue>${artifactId.toLowerCase()}</defaultValue>
</requiredProperty>
<requiredProperty key="ldt">
<defaultValue>${package.getClass().forName("java.time.LocalDateTime").getMethod("now").invoke(null)}</defaultValue>
</requiredProperty>
<requiredProperty key="dtf">
<defaultValue>${package.getClass().forName("java.time.format.DateTimeFormatter").getMethod("ofPattern", $package.getClass().forName("java.lang.String")).invoke(null, "dd MMM yyyy")}</defaultValue>
</requiredProperty>
<requiredProperty key="date">
<defaultValue>${ldt.format($dtf)}</defaultValue>
</requiredProperty>
...
魔法のように動作しますが、ldt
、dtf
とdate
が動作していないようartifactIdLower
プロパティを、エラーを与えます:
Null reference [template 'dtf', line 1, column 1] : ${package.getClass().forName("java.time.format.DateTimeFormatter").getMethod("ofPattern", $package.getClass().forName("java.lang.String")).invoke(null, "dd MMM yyyy")} cannot be resolved.
その後、私はこのヌル参照がどこから来たのかを調べようとしました。私は、$package.getClass()
(または$package.Class
まで)に
をpkgClass
を設定することができましたが、その後、私は(両方pkgClass
とstrClass
はClassオブジェクトである必要があり、funnily十分)$strClass
$pkgClass.forName("java.lang.String")
に$package.getClass().forName("java.lang.String")
にかを設定することができませんでした。
これは、archetype-metadata.xmlの内部でリフレクションを使用することに制限があるかどうか疑問に思いました。
私の質問は、プロジェクト全体で使用できる(上記のような)動的に生成されたプロパティ値を設定するにはどうすればいいですか?
作成するすべてのファイルでこれらのプロパティを定義する必要はありません。後で追加するプロパティが増えている可能性があります。
編集: 私の代わりの#setディレクティブを含まgeneralproperties.vm
ファイルを作成しようとしました。このファイルは#parse( "generalproperties.vm")を使って最初の行にあるすべてのファイルによって読み込まれます。私がファイルをpom.xmlファイルの中から解析する間に、私が望むように動作しませんでした。
次の入力次の出力を生成
test
$null
#set($ldtClass = $package.getClass().forName("java.time.LocalDateTime"))
$ldtClass.Name
$ldtClass.getMethod("now")
#set($ldtNowMethod = $ldtClass.getMethod("now"))
$ldtNowMethod.Name
#set($clsLoader = $package.getClass().getClassLoader())
$clsLoader
#set($ldtClass2 = $clsLoader.loadClass("java.time.LocalDateTime"))
$ldtClass2.Name
$ldtClass2.getMethod("now")
#set($ldtNowMethod2 = $ldtClass2.getMethod("now"))
$ldtNowMethod2.Name
#set($ldt = $ldtNowMethod2.invoke($null))
$ldt
#set($dtf = $package.getClass().forName("java.time.format.DateTimeFormatter").getMethod("ofPattern", $package.getClass().forName("java.lang.String")).invoke($null, "yyyy/MM/dd HH:mm:ss"))
$dtf
:
test
$null
java.time.LocalDateTime
$ldtClass.getMethod("now")
$ldtNowMethod.Name
$clsLoader
$ldtClass2.Name
$ldtClass2.getMethod("now")
$ldtNowMethod2.Name
$ldt
$dtf
が最初の3つの出力が期待されるが、その後、私は私が望む結果を得ることはありません。誰かが上記のいずれかの問題(メタデータファイルまたはgeneralpropertiesファイル)を解決できる場合は、非常に感謝しています。
私はまだ次のエラーが出ています: 'INFO:Null reference [template 'date' $ {package.Class.forName( "java。")} $ {package.Class.forName( "java")} $ {package.Class.forName( "java。 getMethod( "ofPattern"、$ package.Class).invoke(null、 "dd MMM yyyy"))}できません。私はIntelliJ IDEAを使用しています。2017.1.3アルティメットエディション –
あなたのMaven-Archetype-Pluginのバージョンは?私は3.0.1を使用します –
私もそのバージョンを使用しています。あなたはどのようにあなたのアーキタイプを作成しますか? –