【问题标题】:How to run Java 9 application with classpath rather than module path in IDEA?如何在 IDEA 中使用类路径而不是模块路径运行 Java 9 应用程序?
【发布时间】:2017-07-28 10:22:45
【问题描述】:

当我在 IDEA 中运行一个主类时,它会将模块及其依赖项放在模块路径上。是否可以将其更改为类路径?

【问题讨论】:

    标签: java intellij-idea java-9 java-platform-module-system module-path


    【解决方案1】:

    如果您没有定义模块信息,IDEA 会将应用程序和您的依赖项设置在类路径上。由于您有一个模块信息,它是一个显式模块,因此它必须位于模块路径上。通常,您现在会将您的依赖项作为自动模块处理。

    但是,您的依赖项至少有充分的理由位于类路径上。我们在这里讨论过Why Java 9 does not simply turn all JARs on the class path into automatic modules?

    例如,mymodule 依赖于一个自动模块,但它需要一个还不能成为自动模块的 jar。在命令行上它会这样:

    java -cp legacy.jar -p "mymodule.jar;automodule.jar;" -m mymodule/com.example.mymodule.Application

    IMO intellij 目前不支持该功能。作为至少在类路径上运行整个应用程序的一种解决方法,您可以重命名模型信息以暂时禁用/不成为拼图模块。

    【讨论】:

    • 我理解这个问题的意思是他更喜欢从类路径运行整个项目。为什么?谁知道呢,也许是为了测试兼容性。也许是为了规避不适合转换为自动模块的依赖项的问题(例如,因为它们拆分了一个包)。
    • 我认为这个问题没有得到解答——据我所知,在使用 JDK9 时,IntelliJ 没有提供使用类路径而不是模块路径的选项。以及这样做的原因?实际上,整个 Java 生态系统都与模块不兼容——在所有主要的开源项目中都存在拆分包,到处都是无效的模块名称(例如,任何带有 native 字样的 jar,例如 netty、cassandra 等)。现在使用模块是一场没有人愿意打的艰苦战斗。
    【解决方案2】:

    为了回答这个问题,IDEA 用于运行具有模块路径的应用程序的启发式方法目前略有偏差(IDEA 2018.01)。它显然比它应该考虑的更多。

    详情请参阅IDEA-187390IDEA-193714

    因此,如果您当前的项目没有模块信息文件并且您仍然以模块路径结束,那么我知道的当前情况是您正在从依赖项运行主类。只需在您的项目中构建一个小型包装器并从那里运行主类,即可将您带回类路径。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-30
      • 2012-08-29
      • 2017-01-06
      • 2021-09-14
      相关资源
      最近更新 更多