【发布时间】:2012-07-12 06:35:53
【问题描述】:
我有一个 Maven 原型项目。当我使用这个原型时,我希望一些文件报告实际日期。我尝试使用 $date 但 Velocity 无法识别它。我找到了一个名为 DateTools 的东西,但我不知道如何使用它。这是我第一次使用 Velocity。
【问题讨论】:
标签: maven-3 velocity maven-archetype
我有一个 Maven 原型项目。当我使用这个原型时,我希望一些文件报告实际日期。我尝试使用 $date 但 Velocity 无法识别它。我找到了一个名为 DateTools 的东西,但我不知道如何使用它。这是我第一次使用 Velocity。
【问题讨论】:
标签: maven-3 velocity maven-archetype
不幸的是,Maven Archetype 插件没有与 Velocity Tools 捆绑在一起。我通过修改 Maven Archetypes 插件添加了它。假设您使用的是 Maven 2.2.1,请按照以下步骤操作:
svn co -q http://svn.apache.org/repos/asf/maven/archetype/tags/maven-archetype-2.2
cd maven-archetype-2.2
curl -k -O https://raw.github.com/gist/3404715/59c7fa1c20c60e2a165de4109c2acffb8026febd/velocity-tools.patch
patch -p0 -i velocity-tools.patch
mvn install
现在将在本地安装修改后的 Maven Archetype 插件。
您的模板中的$date 用法现在应该呈现,例如
The date is $date
...到:
The date is Aug 20, 2012 4:40:22 PM
【讨论】:
(很抱歉重新提出一个老问题,但我刚刚通过一种方法来实现这一点,而无需拉动和修补插件)。
对于希望能够在其 maven 原型模板中引用日期字段的任何人,我能够使用 pom.xml 模板顶部的以下一组定义来使其工作
#set( $str = "" )
#set( $dt = $str.getClass().forName("java.util.Date").newInstance() )
#set( $year = $dt.getYear() + 1900 )
如果您在插入这些行时已经有可用于模板的基于对象的变量,则可以草拟 $str 声明并改用其中一个变量,因为从哪里获得对的引用并不重要Class.forName() 来自。
注意:我尝试使用 Calendar.getInstance() 进行此操作没有成功。
【讨论】:
我设法将解决方案从@maaxiim 缩减为一行:
#set( $year = $package.getClass().forName("java.util.Date").newInstance().getYear() + 1900 )
$package 变量将始终可从 maven 原型插件中获得。其他内置函数也可以工作,但它们中的大多数都很长,而且 $artifactId.getClass() 看起来......错了。
【讨论】:
在 Java 8 中,使用格式化程序:
#set( $ldt = $package.getClass().forName("java.time.LocalDateTime").getMethod("now").invoke(null) )
#set( $dtf = $package.getClass().forName("java.time.format.DateTimeFormatter").getMethod("ofPattern", $package.getClass()).invoke(null, "yyyy/MM/dd HH:mm:ss") )
#set( $date = $ldt.format($dtf) )
【讨论】: