我正在創建一個原型,並且希望創建一個項目範圍可用的屬性,其中包含當前日期和所有工件ID的小寫變體。我發現the following post on Stackoverflow,這表明它通常應該是可能的。爲原型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>
...
artifactIdLower
就像一個魅力的財產,但ldt
,dtf
和date
似乎不工作,給錯誤:
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.
之後,我試着看看這個空引用來自哪裏。我能夠設置pkgClass
到$package.getClass()
(或$package.Class
),
但在那之後我無法設置$strClass
到$package.getClass().forName("java.lang.String")
或$pkgClass.forName("java.lang.String")
(有趣的是,無論是pkgClass
和strClass
應該是一個類的對象)。
這讓我想知道在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',第1行,第1列]:$ {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「))}不能我正在使用IntelliJ IDEA 2017.1.3終極版 –
你的maven-archetype-plugin的版本是什麼?我使用3.0.1 –
我也在使用該版本。你如何創建你的原型? –