2

是否可以从我的构建中删除 Joda-Time 的时区文件?我只在发布版本中使用 1,在调试版本中使用 2 以用于测试。

我的应用程序仅在一个国家/地区可用,减少 2MB 似乎是一个让我达到 20MB 大关的好主意。

4

1 回答 1

1

您可以获得Joda-Time 的源代码,然后您有一些替代方案。


不要使用任何时区

当您构建项目 ( mvn clean package) 时,它会生成一个joda-time-2.9.9-no-tzdb.jar文件,该文件是一个没有任何时区数据的 jar 文件。使用它需要一些调整:

  1. 使用这个 jar,唯一可用的时区是 UTC。所以DateTimeZone.getAvailableIDs()DateTimeZone.getDefault()返回UTC。您将无法在其他时区之间进行转换,因为 UTC 是唯一可用的时区。
  2. 调用某些方法时,我遇到了一些异常(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。


如果您想减少更多的区域文件,您可以手动编辑它们。但是您必须小心不要从您要保留的时区中删除重要数据。这是有关 IANA tz 文件格式的教程。

请记住,我不建议删除时区数据。所有的历史数据都很重要,并且(几乎)总是有一些时区在幕后起作用。您必须进行大量测试以确保它不会影响应用程序的任何方面(一些与日期相关的错误,特别是涉及时区,可能会很棘手且难以调试)。祝你好运!

于 2017-09-04T13:44:42.320 回答