【问题标题】:In JShell, how to import classpath from a Maven project在 JShell 中,如何从 Maven 项目中导入类路径
【发布时间】:2017-12-07 22:40:25
【问题描述】:

我有一个正在开发的本地 Maven 项目。如何使用包含所有依赖项的项目类路径启动jshell,以便我可以在 JShell 中测试项目或依赖项类。

【问题讨论】:

  • 这似乎是一个有用的用例,但 jshell 教程或在线其他地方没有明确解决。
  • 使用 exec-maven-plugin 怎么样?
  • 您是否正在寻找仅命令行的解决方案?这是一个特定于 IDE 的解决方案:stackoverflow.com/questions/48143960/…
  • 你最好看看 gradle

标签: maven classpath java-9 jshell


【解决方案1】:

我写了一个简单的shell脚本放在执行搜索路径中:

Shell 脚本文件:mshell(用于 *inux)

mvn dependency:build-classpath -DincludeTypes=jar -Dmdep.outputFile=.cp.txt
jshell --class-path `cat .cp.txt`:target/classes

Shell 脚本文件:mshell(适用于 Windows cmd.exe)

mvn dependency:build-classpath -DincludeTypes=jar -Dmdep.outputFile=.cp.txt
for /F %i in (.cp.txt) do jshell --class-path "%i;target/classes"

然后在maven项目目录下(多模块项目,确保在模块目录而不是父目录),运行:

$ cd $MAVEN_PROJECT_HOME   #make sure module folder for multi-module project
$ mshell

gist link

感谢 Jay 指出 -DincludeTypes=jar maven 选项。

【讨论】:

  • 如果你使用 mvn dependency:build-classpath -DincludeTypes=jar 那么它不会包含 pom 依赖项。
  • 如果您也可以为 Windows 创建脚本,很高兴为您投票。
【解决方案2】:

你可以使用 jshell-maven-plugin:

mvn com.github.johnpoth:jshell-maven-plugin:1.3:run

这将使用您的项目的运行时路径启动一个 JShell 会话。如果要包含测试依赖项,只需将 -DtestClasspath 添加到命令中即可。

注意:插件希望项目已经构建。如果没有,请在插件之前调用适当的 Maven 构建阶段,例如:

mvn [install|compile|test-compile] com.github.johnpoth:jshell-maven-plugin:1.3:run

源码:https://github.com/johnpoth/jshell-maven-plugin;欢迎投稿 :) 完全免责声明:我编写了插件。

享受吧!

【讨论】:

  • 这真的很有希望,并且不像公认的答案那样依赖于操作系统!一个问题是,如果存在非 jar 依赖项,插件将无法在无效的类路径参数上启动。有没有办法与其他答案中的 -DincludeTypes=jar 等效?我无法在具有 .nar 依赖项的项目中使用此插件。
  • 用基于弹簧的项目试过这个,但它没有看到弹簧。我在 pom.xml 所在的地方运行它。无法从 org.springframework 导入任何内容。 ... ;我做错了吗?
【解决方案3】:

由于JDK bug 8177650,此处使用--class-path 选项或从maven 启动的解决方案将破坏包自动完成。这是一个适用于包自动完成的 bash 单行代码:

CLASSPATH=`mvn dependency:build-classpath -DincludeTypes=jar -Dmdep.outputFile=/dev/stderr 2>&1 >/dev/null`:target/classes jshell

【讨论】:

    【解决方案4】:

    In Maven, how to output the classpath being used?

    根据:

    jshell --help
    

    运行 JShell:

    jshell --class-path <path>
    

    【讨论】:

    • 这给了你依赖类而不是项目类。是否有一种直接的方法来包含这些内容,以便您可以在整个项目中使用 REPL?
    • 您能否用一个工作示例或详细说明这对您来说实际上是如何工作的?
    【解决方案5】:

    改用 Groovy shell (groovysh) 并执行 groovy.grape.Grape.grab([group:"&lt;maven group&gt;", artifact:"&lt;maven artifact ID&gt;", version:"&lt;version&gt;"]) - 这将为您在类路径中提供必要的 Maven 依赖项的 REPL。

    不确定 jshell 是否比 Groovy shell 有任何值得 Maven 依赖项痛苦的优势。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多