【问题标题】:Preserve the time-stamp of jars that have not changed inside lib folder保留 lib 文件夹内未更改的 jar 的时间戳
【发布时间】:2013-07-15 12:53:41
【问题描述】:

如何在我的 lib 文件夹中保留未更改的 jar 的时间戳?

我正在使用 Robocopy 将我的服务器 lib 文件夹镜像同步到我的本地计算机。我通过速度较慢的 vpn 连接将所有 jar 文件复制到服务器上的 lib 文件夹中,并且只想复制已更改的那些并删除不再需要的那些。\

我需要一种方法来确保在我的 Maven 构建中,删除 lib 文件夹中我不需要的 jar,并且复制到 lib 文件夹中的 jar 只是以前不存在的较新的 jar。

我不希望完全重建文件夹,因为这会修改 jar 上的时间戳,然后...我必须将它们全部复制到服务器!

如果 jar 的原始时间戳由 maven 保留,这样时间戳与我的 maven 存储库中的时间戳保持一致,那就没问题了。不幸的是,Maven 给了它们一个新的时间戳。

我正在使用标准的 maven setup pom 创建一个包含所有依赖项的 lib 文件夹:

<plugin>
                <artifactId>maven-dependency-plugin</artifactId>
                <executions>
                    <execution>
                        <phase>install</phase>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>${project.build.directory}/lib</outputDirectory>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <artifactId>maven-jar-plugin</artifactId>
                <configuration>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <classpathPrefix>lib/</classpathPrefix>
                            <mainClass>${mainClass}</mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>

注意事项:

我的大部分依赖 jar 都是稳定版本的 jar,而我的大部分项目依赖是快照 jar。无论如何,原始库jar的时间戳需要是放在lib中的副本的时间戳。

鉴于 lib 中的 jar 是本地 mvn 存储库中的副本或 jar,mvn clean install 还应该保留它放置在 lib 中的副本的文件 lastmod 时间。至少,这 应该 是默认行为,因为 lib 包含原始 mvn 获取的 jar 文件的真正 副本

同样有趣的是,当 mvn 将提取的 jar 放入本地存储库时,它会保留文件时间。该插件是罪魁祸首,因为它负责将 jar 复制到 lib 并为它们分配新的时间戳 (argg)!

【问题讨论】:

  • 如果你在做mvn clean install 并且你的lib 文件夹是相对于你的${project.build.directory} 的,那不是让你的lib 文件夹总是新的吗?只是为了了解更多,说您的 lib 中的大多数 JAR 都是 SNAPSHOT JAR 是否正确?
  • 我在主要问题中添加了一个 not 来解释。是的,lib 已重建。但是,lib 中的 jar 副本应该与原始文件具有相同的时间戳。这样就彻底解决问题了。
  • 供未来用户参考,为此创建了一个JIRA issue,但它被自动关闭为非活动状态。

标签: java maven package pom.xml preserve


【解决方案1】:

如果您不介意不使用maven-dependency-plugin,您可以尝试在您的pom.xml 中使用这些配置:

<build>
    <plugins>
        <plugin>
            <groupId>com.github.goldin</groupId>
            <artifactId>copy-maven-plugin</artifactId>
            <version>0.2.5</version>
            <executions>
                <execution>
                    <id>copy-deps</id>
                    <phase>package</phase>
                    <goals>
                        <goal>copy</goal>
                    </goals>
                    <configuration>
                        <resources>
                            <resource>
                                <targetPath>${project.build.directory}/lib</targetPath>
                                <dependency>
                                    <includeScope>compile</includeScope>
                                </dependency>
                            </resource>
                        </resources>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

我已经在我的本地机器上尝试过这个,它似乎产生了与我本地 M2 存储库中的 JAR 相同的时间戳。

更多关于插件的信息在这里:
http://evgeny-goldin.com/wiki/Copy-maven-plugin

【讨论】:

  • 谢谢!我会检查一下。我试过了,它在我的库中生成的 jarfile 比 maven-dependency-plugin 少一个。我会看看有什么区别。这看起来可能就是答案。
  • 老实说,我将不得不仔细观察以找出为什么其中一个罐子在一个罐子里而不是另一个罐子里。但是,这解决了问题,因为它做了 Maven-dependency-plugin 应该做的事情——保留复制资源的时间戳!享受你的 50 分吧!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-08
  • 2011-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-07
  • 1970-01-01
相关资源
最近更新 更多