【问题标题】:Maven archetype + Velocity: how to show the dateMaven原型+速度:如何显示日期
【发布时间】:2012-07-12 06:35:53
【问题描述】:

我有一个 Maven 原型项目。当我使用这个原型时,我希望一些文件报告实际日期。我尝试使用 $date 但 Velocity 无法识别它。我找到了一个名为 DateTools 的东西,但我不知道如何使用它。这是我第一次使用 Velocity。

【问题讨论】:

    标签: maven-3 velocity maven-archetype


    【解决方案1】:

    不幸的是,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-archetype-plugin 版本中应用吗?
    • 不知道,我今天早上才写的 :-) 我认为重点可能放在 Maven 3 上。
    • 仍在使用 maven-archetype-plugin 3.0.0。谢谢!
    【解决方案2】:

    (很抱歉重新提出一个老问题,但我刚刚通过一种方法来实现这一点,而无需拉动和修补插件)。

    对于希望能够在其 maven 原型模板中引用日期字段的任何人,我能够使用 pom.xml 模板顶部的以下一组定义来使其工作

    #set( $str = "" )
    #set( $dt = $str.getClass().forName("java.util.Date").newInstance() )
    #set( $year = $dt.getYear() + 1900 )
    

    如果您在插入这些行时已经有可用于模板的基于对象的变量,则可以草拟 $str 声明并改用其中一个变量,因为从哪里获得对的引用并不重要Class.forName() 来自。

    注意:我尝试使用 Calendar.getInstance() 进行此操作没有成功。

    【讨论】:

    • 不使用已弃用的 API,这也有效:#set($year = $str.getClass().forName("java.time.Year").getMethod("now").invoke (null).toString())
    【解决方案3】:

    我设法将解决方案从@maaxiim 缩减为一行:

    #set( $year = $package.getClass().forName("java.util.Date").newInstance().getYear() + 1900 )
    

    $package 变量将始终可从 maven 原型插件中获得。其他内置函数也可以工作,但它们中的大多数都很长,而且 $artifactId.getClass() 看起来......错了。

    【讨论】:

      【解决方案4】:

      在 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) )
      

      【讨论】:

      • 有点讽刺你使用包。虽然它是一个字符串并且始终设置包变量,因此这是完全有效的,但您在名为 package 的变量上使用 getClass 然后从不同的包中获取不同的类这一事实有点有趣。如果您不想依赖更改默认插件(maven 原型),这似乎是最简洁的解决方案
      • 你让我发现了这个没用的 .forName("java.lang.String"),谢谢!
      • 不客气。我在使用此代码时遇到了一些问题。更多信息在这里:stackoverflow.com/q/44350467/2877358想看看有什么问题?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-20
      • 1970-01-01
      • 1970-01-01
      • 2015-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多