【问题标题】:Gradle Compile & Execute the Single Java Class with third-party jar dependencies using Gradle `buildscript`Gradle 使用 Gradle `buildscript` 编译和执行具有第三方 jar 依赖项的单个 Java 类
【发布时间】:2020-08-17 13:59:52
【问题描述】:

我遵循了这个答案https://stackoverflow.com/a/19418847/1665592,但它并不能帮助我使用 Gradle 编译单个 java 文件。上面写着Task :compileMessageKeys NO-SOURCE 为什么?

我只有一个依赖于"apache-ant-1.7.0/ant.jar" jar 的Java 文件CreateMessageKeysTask.java

task compileMessageKeys (type: JavaCompile) {
    doFirst {
        println "$projectDir/precompile"
        new File("$projectDir/precompile").mkdirs()
    }
    source = sourceSets.main.java.srcDirs
    include 'mypackage.build.CreateMessageKeysTask.java'
    classpath = sourceSets.main.compileClasspath
    destinationDir = sourceSets.main.output.classesDir
}

compileMessageKeys.options.compilerArgs = ["-sourcepath", "builder/precompile-task/src/mypackage/build"]

我的ant 脚​​本如下

  <target name="precompile"
          description="builds the CreateMessageKeysTask to generates the MessageKeys interface">
    <mkdir dir="${precompile}" />
    <echo message=" precompile.src: ${precompile.src}" />
    <javac srcdir="${precompile.src}" destdir="${precompile}"
           includes="mypackage/build/**"
           debug="true" fork="true" memoryMaximumSize="${javacCoreMaxMem}"
           includeantruntime="false">
      <classpath>
        <fileset dir="${my.proj.base}/lib/">
          <include name="apache-ant-1.7.0/ant.jar" />
        </fileset>
      </classpath>
    </javac>
  </target>

以下是我的 Java 文件中使用的 import 类语句。

import org.apache.tools.ant.*

import java.io.*;
import java.util.*;

编辑

我也在下面尝试了一些方法,但它仍然没有帮助我

task compileMessageKeys (type: JavaCompile) {
    doFirst {
        println "$projectDir/precompile"
        new File("$projectDir/precompile").mkdirs()
    }
    dependencies{
        compile fileTree(dir: 'lib/', include: ['apache-ant-1.7.0/ant.jar'])
    }
    source = sourceSets.main.java.srcDirs
    include 'mypackage.build.CreateMessageKeysTask.java'
    classpath = sourceSets.main.compileClasspath
    destinationDir = sourceSets.main.output.classesDir
}

【问题讨论】:

  • 一方面,include 采用 Ant 样式文件模式,但您使用的东西看起来像 Java 包引用。但是,总的来说,我建议您创建一个 Gradle 任务(可能在 buildSrc 中)来管理它。
  • 同意..;但我的ant task 依赖于一些ant implementation stackoverflow.com/q/63339476/1665592.. 我现在正在寻找它
  • 我可以用task runWithJavaExec(type: JavaExec) { }的东西编译Java文件然后执行吗?

标签: java gradle gradle-plugin


【解决方案1】:

所以我尝试创建一个单独的源集,而不是配置编译。我就是这样做的。

sourceSets {
    single{
        java {
            srcDir 'src/main/java'
            include '**/Class1.java'
        }
    }
}


task compileSingle(type: JavaCompile) {
    source = sourceSets.single.java
    classpath = sourceSets.main.compileClasspath
    destinationDirectory = sourceSets.main.output.classesDirs[0]
}

现在,当我调用compileSingle 目标时,它只会编译您在包含中添加的各个类。

这是我的 gradle 和目录结构的屏幕截图。 在这里你会看到我的 src 目录中有两个类,但是编译后我在输出中只有一个类。

【讨论】:

  • 我添加了task runScript(dependsOn: 'compileSingle', type: JavaExec) { main = 'CreateMessageKeysTask' classpath = sourceSets.main.compileClasspath },但得到错误Could not find or load main class CreateMessageKeysTask
  • 我认为在 sourceset 上,您必须始终使用该单一来源。
  • 我执行那个Java文件,它为我生成了一些其他的message.propertis文件...编译后,我需要执行它以便可以生成message.propertis
  • 你的类路径应该是 sourceSets.single.compileClasspath IMO。
【解决方案2】:

Gradlebuildscript中编译和执行java代码非常简单

buildscript {
    dependencies {
        classpath files('lib/apache-ant-1.7.0/ant.jar')
    }
}


task CreateMessageKeys {
    def obj = new mypackage.build.CreateMessageKeysTask();
    obj.execute();
}

【讨论】:

    猜你喜欢
    • 2012-12-05
    • 2020-08-19
    • 2014-04-05
    • 1970-01-01
    • 2013-06-07
    • 2018-06-30
    • 1970-01-01
    • 2015-03-12
    • 1970-01-01
    相关资源
    最近更新 更多