2017-06-04 54 views
-1

我正在創建一個原型,並且希望創建一個項目範圍可用的屬性,其中包含當前日期和所有工件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就像一個魅力的財產,但ldtdtfdate似乎不工作,給錯誤:

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")(有趣的是,無論是pkgClassstrClass應該是一個類的對象)。

這讓我想知道在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',第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終極版 –

+0

你的maven-archetype-plugin的版本是什麼?我使用3.0.1 –

+0

我也在使用該版本。你如何創建你的原型? –

0

我能想到的唯一限制是如果您在Velocity配置屬性中使用SecureUberspector而不是標準Uberspector。但是你不能得到java.time.LocalDateTime類,所以情況並非如此,除非你使用的是舊的Velocity版本。使用Velocity 1.7,我可以獲得對now()方法的參考並調用它。

另外,你確定直接的Java版本正常工作嗎?例如,我在Class.getClassLoader() javadoc中讀到:「某些實現可能使用null來表示引導類加載器。如果此類由引導類加載器加載,則此類方法將在此類實現中返回null。「

+0

我使用的是最新版本的Maven原型的,它使用速度1.7我覺得奇怪的是原型的元數據文件和解析的文件之間的矛盾的解析。文件無法獲得'now'方法,其中元數據文件甚至無法通過使用'forName'到達該類。任何想法? –