2017-06-04 6 views
-1

私はアーキタイプを作成していて、現在の日付とすべての小文字のアーティファクト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> 
    ... 

魔法のように動作しますが、ldtdtfdateが動作していないよう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を設定することができましたが、その後、私は(両方pkgClassstrClassは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ファイル)を解決できる場合は、非常に感謝しています。

答えて

1

これは動作するはずです:

... 
<requiredProperty key="date"> 
    <defaultValue>${package.getClass().forName("java.time.LocalDateTime").getMethod("now").invoke(null).format($package.Class.forName("java.time.format.DateTimeFormatter").getMethod("ofPattern", $package.Class).invoke(null, "dd MMM yyyy"))}</defaultValue> 
</requiredProperty> 
... 
+0

私はまだ次のエラーが出ています: '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アルティメットエディション –

+0

あなたのMaven-Archetype-Pluginのバージョンは?私は3.0.1を使用します –

+0

私もそのバージョンを使用しています。あなたはどのようにあなたのアーキタイプを作成しますか? –

0

Velocityの設定プロパティで標準のUberspectorの代わりにSecureUberspectorを使用している場合は、私が考えることができる唯一の制限です。しかし、あなたはjava.time.LocalDateTimeクラスを取得することができないので、古いVelocityバージョンを使用している場合を除き、そうではありません。 Velocity 1.7では、now()メソッドへの参照を取得し、呼び出すことができます。

また、ダイレクトJavaバージョンが正しく動作していますか?たとえば、私はClass.getClassLoader() javadocで、 "実装によっては、ブートストラップクラスローダーを表すためにnullを使用することがあります。このメソッドは、このクラスがブートストラップクラスローダーによってロードされた場合、nullを返します。「

+0

を私は考える速度1.7を使用して、Maven原型の最新バージョンを使用しています奇妙なことが原型-メタデータファイルと解析されたファイル間の矛盾で解析されました。メタファイルが 'forName'を使ってクラスに到達することができない' now'メソッドを得ることができません。何か考えましたか? –

関連する問題