Java 使用Spring引导启动脚本时,如何获取当前工作目录

Java 使用Spring引导启动脚本时,如何获取当前工作目录,java,spring-boot,command-line-interface,Java,Spring Boot,Command Line Interface,没有 var cwd=Path.of(“”); log.info(“user.dir:{}”,Path.of(System.getProperty(“user.dir”)); log.info(“cwd:{}”,cwd.toabsolutionPath()); log.info(“PWD:{}”,System.getenv(“PWD”); ^最后一个,以跨平台兼容的方式 我使用的是Spring启动jar启动脚本 tasks.withType<BootJar> { mainCla

没有

var cwd=Path.of(“”);
log.info(“user.dir:{}”,Path.of(System.getProperty(“user.dir”));
log.info(“cwd:{}”,cwd.toabsolutionPath());
log.info(“PWD:{}”,System.getenv(“PWD”);
^最后一个,以跨平台兼容的方式

我使用的是Spring启动jar启动脚本

tasks.withType<BootJar> {
  mainClass.set("com.xenoterracide.brix.Application")
  archiveBaseName.set("brix")
  launchScript {
    properties(
      mapOf(
        "spring.config.location" to "classpath:application.properties"
      )
    )
  }
}
tasks.withType{
mainClass.set(“com.xenoterracide.brix.Application”)
archiveBaseName.set(“brix”)
启动脚本{
性质(
地图(
“spring.config.location”到“classpath:application.properties”
)
)
}
}

如何获取真正的工作目录?

您不能使用默认的启动脚本。这主要针对作为服务而不是CLI应用程序使用的应用程序,并且不能使用默认脚本进行自定义

我建议使用SpringBoot的功能构建一个完全可执行的jar文件,其中包含一个满足您需求的自定义启动脚本。您可以使用
脚本
属性执行此操作:

tasks.getByName<BootJar>("bootJar") {
    launchScript {
        script = file("src/custom.script")
    }
}

应用程序执行时的实际工作目录由系统属性
user.dir
给出,如您所见。显然,在运行代码之前,有什么东西改变了它。你对此无能为力。似乎是一个错误,它打破了这个。。。我不希望任何Unix应用程序以这种方式工作,特别是因为您根本无法获取这些信息。但是好的,谢谢。最好让插件文档记录示例脚本,或者可能记录所用脚本的位置以及任何类似的意外行为。
tasks.getByName<BootJar>("bootJar") {
    launchScript {
        script = file("src/custom.script")
    }
}

#!/bin/bash

[[ -n "$DEBUG" ]] && set -x

working_directory="$(pwd)"

# Follow symlinks to find the real jar
cd "$(dirname "$0")" || exit 1
[[ -z "$jarfile" ]] && jarfile=$(pwd)/$(basename "$0")
while [[ -L "$jarfile" ]]; do
  jarfile=$(readlink "$jarfile")
  cd "$(dirname "$jarfile")" || exit 1
  jarfile=$(pwd)/$(basename "$jarfile")
done

cd "$working_directory"

# Find Java
if [[ -n "$JAVA_HOME" ]] && [[ -x "$JAVA_HOME/bin/java" ]]; then
    javaexe="$JAVA_HOME/bin/java"
elif type -p java > /dev/null 2>&1; then
    javaexe=$(type -p java)
elif [[ -x "/usr/bin/java" ]];  then
    javaexe="/usr/bin/java"
else
    echo "Unable to find Java"
    exit 1
fi

arguments=(-Dsun.misc.URLClassPath.disableJarChecking=true $JAVA_OPTS -jar "$jarfile" $RUN_ARGS "$@")

"$javaexe" "${arguments[@]}"
exit $?