【问题标题】:how jar file executes after running maven deploy?运行maven deploy后jar文件如何执行?
【发布时间】:2021-12-28 12:24:28
【问题描述】:

我正在做一个项目,当我运行 maven test 时,我将所有依赖项都作为 jars,所以我可以在编辑代码时使用这些 jars 中的类方法,但是我想知道什么时候运行 maven deploy 来打包将代码作为 jar 并将其放在远程存储库中,这个 jar 是如何执行的?它不需要pom中提到的所有罐子吗?因为在读取 jar 的内容时,它只包含 src/main/java 下的代码编译类。 我认为有一点我误解了。如果我错过了一些基础知识,或者我应该知道的,请给我一个好的指南。 提前致谢

【问题讨论】:

  • 谢谢,但这根本不是我的意思,我不是在问 maven 部署和安装之间的区别,我只是想知道如何在运行部署时管理本地依赖项下载的 jar,所以当我需要运行我的代码,我可以在不将 jar 文件放在同一位置的情况下运行它吗?或者它们应该与包含我的代码的 jar 一起部署?
  • 好吧,是也不是,因为如果你真的知道区别,你就不会问你的问题。但显然@Szprota21 在你的问题上回答得比我好

标签: java maven jar executable-jar


【解决方案1】:

就像你说的,要运行一个 jar,你需要每个依赖项。但是要将它放在存储库中,您不需要它。

所以基本上,当你想创建可运行的 jar 时,你需要一些 maven 构建插件,它们会将每个依赖项打包到你的 .jar 文件中,比如 maven-shade-plugin。

如果您想打包一个 jar 以将其上传到远程存储库以供其他人使用,您不需要这样做,因为现在它站在将使用您的依赖项下载您创建的每个依赖 jar 的人的一边(maven 会自动执行)。

示例

这一切都取决于你需要做什么。

假设您有一个控制台应用程序,它显示芝加哥的天气,该应用程序使用依赖项来获取天气,我们将其称为 weather-dep,因此您的应用程序内部需要一个 weather-dep 依赖项。

现在,如果您希望您的用户只运行它(jar 可以从控制台“java -jar yourWeatherApp.jar”运行),您需要以 yourWeatherApp.jar 将包含在 weather-dep.jar 中的方式打包它打包过程中会下载哪个maven。

第二个选项是当您知道有人想使用 yourWeatherApp.jar 显示芝加哥的天气时,该人将他的应用程序命名为 usaWeatherApp.jar,他会将您的依赖项包含在他的应用程序中,然后他将能够使用类来自 yourWeatherApp.jar 也来自 weather-dep.jar,因为它是您应用程序内部的依赖项。

您只需要知道哪个用例最适合您。

当有人不想只运行您的应用程序而不在他们的应用程序中包含它的函数/类等时,您可以打包包含依赖项的 jar。

【讨论】:

  • 你的意思是每个人都想执行上传的jar,他必须运行maven,它会下载依赖然后执行jar?如果这就是你的意思,如果我想在詹金斯中运行这个罐子怎么办?我的意思是从存储库下载 jar,我只想执行它,这怎么可能?因为我认为在执行jar之前运行maven并下载依赖项效率不高
  • 我编辑了我的答案,希望对您有所帮助
  • 好吧很清楚,但是重点是,我在运行maven deploy或者package的时候,在读取jar文件内容的时候,只能看到我的classes,看不到maven下载的依赖当我在本地运行我的代码时。
  • 那是因为默认的 maven 不会在你的 jar 中包含依赖 jar。试试 maven-shade-plugin 有关于谷歌的教程如何设置它,然后在 mvn clean install 你会收到你的 jar 里面有依赖项。 stackoverflow.com/questions/13865255/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-06
  • 1970-01-01
相关资源
最近更新 更多