如何在 Gradle 中创建一个 jar,同时保持 applicationDefaultJvmArgs 路径不为空?

How do I create a jar in Gradle while keeping applicationDefaultJvmArgs path not null?

我搞不懂这个问题。如何在 Gradle 中创建一个包含非空 applicationDefaultJvmArgs 的 jar 文件?

在我的 java 程序中,我的配置文件需要以下字符串变量:

String CONFIG_PATH = "config.dir";
String configFilePath = System.getProperty(CONFIG_PATH);

我有以下 build.gradle 文件。

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'application'
apply plugin: 'distribution'

version 1.0
mainClassName = 'app.service.AppMain'

def projectDir = file("src/main/java")
def configDir = file("src/main/config")
def resourceDir = file("src/main/resources")

applicationDefaultJvmArgs = ["-Dconfig.dir=${configDir}", "-Dresources.dir=${resourceDir}"]

sourceSets {
    main {
        java {
            srcDir projectDir
        }
        resources {
            srcDirs configDir, resourceDir
        }
    }

}

dependencies {
...
}

distributions {
    main {
        contents {
            into('') {
                from { fileTree(configDir) }
            }
        }
    }
}

repositories    {
    maven {
        url "https://plugins.gradle.org/m2/"
    }
  def installDir = System.getProperty("user.dir") + "/lib"  
  def d = new File (installDir)
  if ( d.exists() ) {
      flatDir { dirs installDir }
    } else {
      mavenCentral()
  }
}

jar {
    manifest {
        attributes("Implementation-Version": "$version",
                   "Main-Class": "$mainClassName")
    }
   doFirst {
        from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } } 
    }
    exclude 'META-INF/*.RSA', 'META-INF/*.SF','META-INF/*.DSA' 
}

// Augments the run task to add arguments
// e.g.  gradle run -PappArgs=--list
run {
    if (project.hasProperty("appArgs")) {
        args(appArgs.split(','))
    }
}

构建后,当我 运行 ./app 可执行文件来自 app/build/distributions/app/bin/ 目录时configFilePath 字符串正确打印为 /home/user/app/src/main/config.

但是,当我转到 app/build/libs 目录和 运行 java -jar app-1 时。 0.jar 我的 configFilePath 得到 null。非常感谢任何帮助。

简答:你不能,jar 不能保存 jvm args。

applicationDefaultJvmArgsapplication plugin 的 属性。它对常规构建的 jar 没有影响。

您不能在 jar 中包含 jvm args,java 二进制文件直接将它们作为参数。所以要么你坚持使用 application 插件提供的生成的可执行文件,要么你硬编码它(但我认为你不会)