Gradle Скомпилируйте и выполните один класс Java со сторонними зависимостями jar с помощью Gradle `buildscript` - PullRequest
5 голосов
/ 07 августа 2020

Я последовал этому ответу { ссылка }, но это не помогает мне компилировать отдельные java файлы с помощью Gradle. Он говорит: Task :compileMessageKeys NO-SOURCE Почему?

У меня только один Java Файл CreateMessageKeysTask.java, который зависит от "apache-ant-1.7.0/ant.jar" jar

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>

Ниже приведены операторы класса import, используемые в моем Java файле.

import org.apache.tools.ant.*

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

EDIT

Я кое-что пробовал ниже, но мне это все равно не помогает

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
}

Ответы [ 2 ]

3 голосов
/ 12 августа 2020

Итак, я попытался создать отдельный исходный код вместо настройки компиляции .. Вот как я это сделал.

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 target, он будет компилировать только соответствующие классы, которые у вас есть добавлено в включает.

Вот скриншоты из моей структуры gradle и каталогов. введите описание изображения здесь Здесь вы увидите, что у меня есть два класса в моем каталоге sr c, но после компиляции у меня есть только один класс на выходе.

1 голос
/ 14 августа 2020

Довольно просто скомпилировать и выполнить код java в Gradle с buildscript

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


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