是否可以从我的构建中删除Joda-Time中的时区文件?我只在发布版本中使用1,在调试版本中使用2在测试中使用。
我的应用程序仅在一个国家/地区提供,减少2MB似乎是一个好主意让我获得20MB标记。
答案 0 :(得分:1)
你可以获得Joda-Time's source code然后你有一些选择。
当您构建项目(mvn clean package
)时,它会生成一个joda-time-2.9.9-no-tzdb.jar
文件,这是一个没有任何时区数据的jar文件。使用它需要一些调整:
DateTimeZone.getAvailableIDs()
和DateTimeZone.getDefault()
只返回UTC。您无法在其他时区之间进行转换,因为UTC是唯一可用的时区。在调用某些方法时,我会遇到一些异常(Resource not found: "org/joda/time/tz/data/ZoneInfoMap"
)。要摆脱它,我必须将默认时区提供程序设置为UTC:
System.setProperty("org.joda.time.DateTimeZone.Provider", "org.joda.time.tz.UTCProvider");
这样,例外情况就不复存在了。
如果你想使用另一个时区而不仅仅是UTC,那么还有另一种选择。
在pom.xml
文件中,查找compile-tzdb
执行并评论您不想包含在jar中的文件。在这个例子中,我只保留southamerica
文件:
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.4.0</version>
<executions>
<execution>
<id>compile-tzdb</id>
... lots of lines ...
<!-- Commenting the TZ files I don't want -->
<!-- <argument>africa</argument> -->
<!-- <argument>antarctica</argument> -->
<!-- <argument>asia</argument> -->
<!-- <argument>australasia</argument> -->
<!-- <argument>europe</argument> -->
<!-- <argument>northamerica</argument> -->
<argument>southamerica</argument>
<!-- <argument>pacificnew</argument> -->
<!-- <argument>etcetera</argument> -->
<!-- <argument>backward</argument> -->
<!-- <argument>systemv</argument> -->
然后用:
构建它mvn clean package -Dmaven.test.skip=true
我正在跳过测试,因为其中一些测试使用的是南美文件中没有的时区(例如Europe/London
)。当然你也可以根据需要改变测试,但是我选择了最快的方式(我通常不会在生产版本中跳过测试,不要评判我)
然后,joda-time-2.9.9.jar
文件将仅包含南美时区文件。如果要包含同义词(某些区域的名称已更改,但旧名称保留并成为backward
文件中的同义词),您可以选择在构建中包含backward
文件。
有了这个,生成的jar将只包含南美洲区域和UTC。如果JVM默认时区不是南美时区之一,DateTimeZone.getDefault()
将返回UTC。
如果您想减少更多区域文件,可以手动编辑它们。但是,您必须小心不要从要保留的时区中删除重要数据。 Here's a tutorial关于IANA tz文件的格式。
请记住,删除时区数据不是我建议的。所有历史数据都很重要,并且(几乎)总是在幕后扮演一些时区。您必须进行大量测试以确保它不会影响应用程序的任何方面(某些与日期相关的错误,特别是涉及时区,可能很棘手且难以调试)。祝你好运!