最好将您的项目 jar 文件 Mavenize 或将它们放在 WEB-INF/lib 中?

Posted

技术标签:

【中文标题】最好将您的项目 jar 文件 Mavenize 或将它们放在 WEB-INF/lib 中?【英文标题】:Is it best to Mavenize your project jar files or put them in WEB-INF/lib? 【发布时间】:2011-09-28 02:23:40 【问题描述】:

我一直在为我的 Spring MVC 项目需要的所有 jar 文件执行此操作:

call mvn install:install-file -DgroupId=vegetables -DartifactId=potatoes -Dversion=1.0 -Dfile=vegetables-1.0.jar  -Dpackaging=jar -DgeneratePom=true

最近我一定超出了您可以在pom.xml 文件中列出的依赖项数量的限制,因为我收到一条错误消息:

Your command line is too long

所以我从 pom.xml 中删除了一些我的项目不再使用的依赖项,并且我能够再次使用 maven 运行该项目。

我的问题是,我是否应该像迄今为止所做的那样将所有 jar 文件安装到我的 Maven 存储库中?还是应该将其中的一些放到WEB-INF/lib 目录中?

这里的最佳做法是什么?

【问题讨论】:

当错误发生时你的pom.xml有多少依赖? 我没有关于最佳实践的答案......但我可以告诉你,许多 shell(例如 Windows cmd.exe 和 Unix 的 ksh)对 4K 长度的限制一个命令。我们使用 Weblogic 服务器命令行遇到了这个问题。我们最终将我们普遍存在的(但相当静态的)库(如 xerces、xalan、apache commons、apache 集合等)重新打包到一个 common.jar 文件中,并且我们还简化并缩短了服务器目录名称。花了一点时间,但现在一切都开始可靠了。 @splash:当错误发生时,我在pom.xml 中列出了大约 50 个依赖项。 @corlettk:很有趣。我没有意识到这可能是来自外壳的错误。我在Windows 7 上使用cmd.exe,但不知道有4k 限制。 【参考方案1】:

我一直在用命令行做同样的事情,但是通过在我的 POM 中配置 maven-install-plugin(请阅读最后的注释):

     <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-install-plugin</artifactId>
            <executions>
                <execution>
                    <id>install-vegetables</id>
                    <phase>initialize</phase>
                    <goals>
                        <goal>install-file</goal>
                    </goals>
                    <configuration>
                        <file>$project.basedir/lib/vegetables-1.0.jar</file>
                        <groupId>vegetables</groupId>
                        <artifactId>potatoes</artifactId>
                        <version>1.0</version>
                        <packaging>jar</packaging>
                    </configuration>
                </execution>
                <execution>
                    <id>install-minerals</id>
                    <phase>initialize</phase>
                    <goals>
                        <goal>install-file</goal>
                    </goals>
                    <configuration>
                        <file>$project.basedir/lib/minerals-1.0.jar</file>
                        <groupId>minerals</groupId>
                        <artifactId>rocks</artifactId>
                        <version>1.0</version>
                        <packaging>jar</packaging>
                    </configuration>
                </execution>
            </executions>
        </plugin>

它的效率要低得多,因为文件会一遍又一遍地安装,但它比手动安装要少得多。无论如何,我认为你应该试一试。

【讨论】:

能否更改 元素,以便可以显式运行安装,与主构建工作流分开?不利的一面是可能会在更新依赖项 jar 时忘记运行它,但我宁愿选择更快的构建。 我不知道。但你当然可以为此使用个人资料。【参考方案2】:

您的所有依赖项都应位于本地存储库下。根据 Maven 约定/最佳实践,您不应在项目中保留 jar 文件。

将您的项目转换为完全基于战争的 Maven 项目。这会将所有依赖项(jar 文件)放在 webapp 的 WEB-INF/lib 目录下。因此,您不必担心路径很长。

【讨论】:

【参考方案3】:

您只需在 pom.xml 文件中添加依赖项,无需手动安装。 Maven 将下载库并在需要时将其放入本地存储库。只有当您想使用第三方(自定义)库时,您才可以将其安装在本地存储库中。

【讨论】:

以上是关于最好将您的项目 jar 文件 Mavenize 或将它们放在 WEB-INF/lib 中?的主要内容,如果未能解决你的问题,请参考以下文章

为啥将您的 Javascript 文件移动到您也拥有的不同主域?

在 Android 中将资产或原始文件或资源文件作为 File 对象读取

PDI(Pentaho Kettle)Jar 文件的 Maven 依赖项

将您的 jwt 令牌存储在 react 或 angular 或 vue 中

markdown 将您的Laravel项目带到另一台机器上

从 .jar 文件重新创建项目