java - Java 程序如何找到它的 Maven 包?

标签 java maven intellij-idea

我在 IntelliJ 中有一个 Java 程序,它有一个 pom.xml 并使用 Maven。这些包已下载,目前由 IntelliJ 找到。

虽然我有点困惑,因为据我所知,Maven 存储库不是 CLASSPATH 的一部分。那么 IntelliJ 是否只是在其 Maven 存储库中查找包的地方做了一些魔术? (我认为 IntelliJ 有自己的 Maven 存储库。我单独安装了 Maven 3,但我认为它没有使用它。)

但更一般地说:如果您使用 Maven 构建 JAR,那么我猜它会将依赖项放在 JAR 中,Java 程序可以找到它们,所以不会有问题。但是如果你只是直接运行一个 Java 程序,你是否需要将 Maven 存储库添加到你的类路径或者发生其他事情?

感谢您提供的任何信息,以减轻我的困惑:)

最佳答案

当您使用 main() 方法的运行时配置从 IntelliJ 启动程序时,IntelliJ 会从所有项目依赖项构造类路径。您可以在“运行”窗口中看到这一点,第一行日志是用于启动 main()java 命令。这是一条很长的线,但通常看起来类似于:

java -javaagent:/opt/idea/idea-IC-173.3727.127/lib/idea_rt.jar=40165:/opt/infra/idea/idea-IC-173.3727.127/bin -Dfile.encoding=UTF-8 -classpath /home/ [...]

IntelliJ 构造 -classpath 参数,添加模块 target 目录和从本地 Maven 存储库引用的 Maven 依赖项。

当您使用 Maven mvn clean package 打包项目时,它通常会变成一个只有您的代码的独立 JAR(除非您更改了默认值)。现在您有几个选择如何提供启动 main() 所需的依赖项:

  1. 像 IntelliJ 一样使用 -classpath 参数提供它们。
  2. 添加maven-shade-plugin 并使用shade 目标构建a runnable Uber JAR .这将创建一个不需要 -classpath 的胖 JAR。
  3. 使用其他一些 Maven 插件来执行第 2 点,例如Spring Boot spring-boot:repackage 目标。

关于java - Java 程序如何找到它的 Maven 包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49287525/

相关文章:

java - 从 List<String[]> 中删除重复项

java - 如何在Android Studio中启用String.xml中的状态栏,我突然点击了隐藏通知

java - 如何将 LIRE 依赖项添加到 Maven?

java - 为什么使用 Yeoman 的生成器而不是 Maven 的原型(prototype)?

java - IntelliJ 如何知道目录是 'source' 还是 'test source'?

android - 重复类错误 : Execution failed for task ':app:checkDebugDuplicateClasses'

java - 无法附加到 HDFS

Java 更改现有组件

java - 如何通过 Maven 属性激活配置文件?

java.lang.RuntimeException : Duplicate class org. intellij.lang.annotations.Flow 在模块 annotations-16.0.1.jar 和 annotations-java5-15.0.jar 中找到