Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Gradle Compile & Execute the Single Java Class with third-party jar dependencies using Gradle `buildscript`

Tags:

I followed this answer https://stackoverflow.com/a/19418847/1665592 but it doesn't help me to compile single java files using Gradle. It says Task :compileMessageKeys NO-SOURCE Why?

I just have only one Java File CreateMessageKeysTask.java which is dependent on "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"]

My ant script is as below

  <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>

Below are the class import statements used in my Java File.

import org.apache.tools.ant.*

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

EDIT

I tried something below as well but it still not help me

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
}
like image 577
Swapnil Kotwal Avatar asked Aug 07 '20 11:08

Swapnil Kotwal


2 Answers

So I tried creating a separate sourceset, instead of configuring compile.. This is how I did.

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]
}

Now, when I call compileSingle target, It will compile only respective classes you have added in includes.

Here are the screenshots from my gradle and directory structure. enter image description here Here you will see that I have two classes in my src directory, but post compile I have only one class in the output.

like image 98
Anand Vaidya Avatar answered Sep 30 '22 19:09

Anand Vaidya


It is pretty simple in to compile and execute java code in Gradle with buildscript

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


task CreateMessageKeys {
    def obj = new mypackage.build.CreateMessageKeysTask();
    obj.execute();
}
like image 29
Swapnil Kotwal Avatar answered Sep 30 '22 17:09

Swapnil Kotwal