3

manifest.xmlOpenCMSプロジェクトのAntビルド中にファイルを書き込んでいます。

ファイルの作成日とファイルの最終変更日を取得できる必要があります。(現在のプロセスでは、とにかく各ファイルにタイムスタンプが付けられていますが、Wed, 31 Dec 1969 19:00:00 EST少なくともWindowsマシンでは、ビルドを実行します。)

Antでファイルの作成日のタイムスタンプを取得する方法はありますか?標準のAntタスクとAnt-Contribタスクを使用しています。

4

4 に答える 4

4

私はこれを機能させました。

Mark O'Connorが指摘したように、以前のバージョンのJavaからファイル作成時間を取得することはできません。ただし、このタスクに使用されていた元のJavaプログラムは、作成日と最終変更日1の両方にlastModifiedメソッドを使用していました。私は同じことをして大丈夫でした。

<scriptdef>ファイルから最終更新日をプルするためにを作成しました。Java 1.6以降では、Rhino JavaScriptライブラリに直接アクセスできるため、BeanShellライブラリは不要になりました。

<scriptdef name="file.mdate" language="javascript"> 
    <attribute name="file"/> 
    <attribute name="property"/> 
        file_name = attributes.get("file"); 
        property_to_set = attributes.get("property");

        file = new java.io.File(file_name); 
        file_date = file.lastModified();

        date_format = new java.text.SimpleDateFormat("EEE, dd MMM YYYY HH:mm:ss zzz");
        formated_date = date_format.format(new java.util.Date(file_date));
        project.setNewProperty(property_to_set, formated_date);
</scriptdef> 

定義したら、Antタスクとして使用できます。

<file.mdate
    file="${file.name}"
    property="file.modified.date"/>
<echo>The file "${file}" was modified on ${file.modified.date}</echo>
于 2013-02-06T22:15:33.080 に答える
2

それはあなたのOSに依存します、feUnixはファイル作成時間を保存しません、ここで詳細を見てください
2つの可能な解決策:

解決策1は、Java>=6のWindowsでのみ機能します。アドオンは必要ありません。

<project>
  <!-- Works on Windows only, uses the jdk builtin
       rhino javascript engine (since jdk6)
       use dir command without /T:C to get lastmodificationtime
  -->
  <macrodef name="getFileTimes">
    <attribute name="dir" />
    <attribute name="file" />
    <attribute name="setprop" default="@{file}_ctime" />
    <sequential>
      <exec executable="cmd" dir="@{dir}" outputproperty="@{setprop}">
        <arg value="/c" />
        <arg line="dir @{file} /T:C|find ' @{file}'" />
      </exec>
      <script language="javascript">
     tmp = project.getProperty("@{setprop}").split("\\s+") ;
     project.setProperty("@{setprop}", tmp[0] + "/" + tmp[1]) ;
   </script>
    </sequential>
  </macrodef>

  <getFileTimes dir="C:/tmp" file="bookmarks.html" />

  <echo>
  $${bookmarks.html_ctime} => ${bookmarks.html_ctime}
  </echo>
</project>

ソリューション2には、Java 7とgroovy-all-xxxjar(groovyバイナリリリースに含まれています)が必要です。SimpleDateFormat
を好みに合わせて調整します。
Unixファイルシステムでは、作成時間を要求すると、最終変更時刻が取得されます。

<project>
  <taskdef name="groovy" classname="org.codehaus.groovy.ant.Groovy"/>

  <!-- Solution for Java 7, uses the nio package
       needs groovy-all-2.1.0.jar
  -->
  <macrodef name="getFileTimes">
    <attribute name="file"/>
    <attribute name="ctimeprop" default="@{file}_ctime"/>
    <attribute name="mtimeprop" default="@{file}_mtime"/>
    <sequential>
      <groovy>
      import java.nio.file.*
      import java.nio.file.attribute.*
      import java.text.*
      import java.util.date.*

      Path path = Paths.get("@{file}")
      BasicFileAttributeView view = Files.getFileAttributeView(path, BasicFileAttributeView.class)
      BasicFileAttributes attributes = view.readAttributes()
      lastModifiedTime = attributes.lastModifiedTime()
      createTime = attributes.creationTime()
      DateFormat df = new SimpleDateFormat("dd-MMM-yyyy hh:mm:ss", Locale.US)
      df.format(new Date(createTime.toMillis()))

      properties.'@{ctimeprop}' = df.format(new Date(createTime.toMillis()))
      properties.'@{mtimeprop}' = df.format(new Date(lastModifiedTime.toMillis()))
     </groovy>
    </sequential>
  </macrodef>

  <getFileTimes file="C:/tmp/bookmarks.html"/>

  <echo>
    $${C:/tmp/bookmarks.html_ctime} => ${C:/tmp/bookmarks.html_ctime}
    $${C:/tmp/bookmarks.html_mtime} => ${C:/tmp/bookmarks.html_mtime}
  </echo>
</project>

組み込みのJavaScriptエンジンも使用してみましたが、次のようなエラーが発生しました。

sun.org.mozilla.javascript.internal.EvaluatorException: missing name after . operator

IMO、javascriptを使用した単純なもの<script language="javascript">で十分ですが、javaパッケージなどをインポートする必要がある場合は、PITAです。Groovyは単純に機能します。

于 2013-02-06T23:11:23.343 に答える
1

問題は、標準のJavaファイルオブジェクトが最終変更日を返すメソッドのみをサポートしていることです。

この問題は、新しいNIOクラスを使用してJava7で対処されます。

明らかに、ANTでこれを利用するには、カスタムタスクを作成するか、スクリプトを埋め込む必要があります。

于 2013-02-05T23:20:59.117 に答える
0

David Wsの回答にバグがありました。属性は2回目の実行で上書きされないため、2回目の実行では機能しません。

変更project.setNewPropertyproject.setProperty

完全なコードスニペット:

<scriptdef name="filedate" language="javascript">
    <attribute name="file"/>
    <attribute name="property"/>
        <![CDATA[
            file_name = attributes.get("file");
            property_to_set = attributes.get("property");

            file = new java.io.File(file_name);
            file_date = file.lastModified();

            date_format = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            formated_date = date_format.format(new java.util.Date(file_date));
            project.setProperty(property_to_set, formated_date);
        ]]>
</scriptdef>
于 2014-09-16T15:50:53.080 に答える