How to convert an ant snippet to Gradle - gradle

Hi I am completely new to Gradle. Can anyone please help me as to how I can convert this ant task into Gradle. I am trying to see if I can learn by example.
<property file="build.properties"/>
<path id="classpath">
<fileset dir="${ear.dir}/EarContent/APP-INF">
<include name="**/*.jar" />
</fileset>
</path>
<target name="clean">
<delete file="${dist.dir}/*.jar" failonerror="false"/>
<delete failonerror="false">
<fileset dir="${build.dir}">
<include name="**/*.class" />
</fileset>
</delete>
</target>
<target name="init">
<mkdir dir="${dist.dir}"/>
<mkdir dir="${build.dir}/classes"/>
</target>
<target name="jar" depends="clean, init">
<javac srcdir="${src.dir}" destdir="${build.dir}/classes" debug="on">
<classpath refid="classpath"/>
</javac>
<jar destfile="${dist.dir}/phIntegration.jar">
<fileset dir="${build.dir}/classes" />
</jar>
</target>

I'm not convinced that trying move ANT build 1-1 to Gradle is a good learning exercise, although Gradle provides good integration with ANT.
Generally speaking, the build.gradle file for your project shall like somewhat like that:
apply plugin: 'java'
dependencies {
compile fileTree(dir: 'CLASSPATH_DIR', include: ['**/*.jar'])
//if you want you can use JARS from your filesystem as a classpath
//but you probably should use Ivy or Maven dependency management systems
}
sourceSets {
main {
java 'src/main/java'
//tweak the location of your source code, by default Gradle looks for sources in `src/main/java`
}
}
Once you invoke gradle clean build it will compile your sources and create a jar file containing the sources in build/libs directory. You can change the JARS name by adding the rootProject.name='your project name' in the settings.gradle directory.
The snippet uses Java plugin and the default behaviour of Gradle. If you want you can tweak its behaviour by using Delete Task or Jar Task.
If you define properly inputs/outputs of a task the init task won't be necessary since Gradle will take care of directories recreation if they're not existent. (Default tasks do that, if you start writing your own tasks you most probably will have to take care of that by your own)

Related

Maven regular expression to match file is not working

I have two files test-200-12-30-2990 and test-project-200-12-30-2990 I am unziping it to corresponding folders. Second task is not working. I want to select the file 'test-200-12-30-2990'
Below is the ant build.xml. I am using maven ant plugin inside pom
<mkdir dir="/testdir"/>
<unzip dest="src/main/resources/testdir">
<fileset dir="src/main/resources">
<include name="**/test-project*.zip"/>
</fileset>
</unzip>
</target>
<mkdir dir="/test-projectdir"/>
<unzip dest="src/main/resources/test-projectdir">
<fileset dir="src/main/resources">
<include name="**/test[1-9].zip"/>
</fileset>
</unzip>
</target>
I'm not quite sure how inclusion might work in Maven, but maybe we could solve this problem with a simple expression that you already have, something maybe similar to:
test-[0-9-]+
Then, the include might look like:
test-[0-9-]+\.zip
**/test-[0-9-]+\.zip
If escaping . might be unnecessary, then we can just use:
**/test-[0-9-]+.zip
DEMO
Reference
Include xml files in maven project

Ant Target to Expand Archives of Dependency

I have an Ant/Ivy build process that I am trying to improve. I need to resolve dependencies and then extract them to a particular folder.
The dependencies resolve to a $(build_root)/dependency/downloads/[configuration]/[artifactId]/[version]/ location and this works fine. I end up with a .pom and a .tar.bz2 file in that location.
What I would like to do is have a bit more control over the extraction of the dependency's .tar.bz2 to a directory. We're basically trying to prevent conflicts for a dependency's lib and inc by controlling how and where the extraction of the .tar.bz2 output occurs.
We currently do this by resolving all the dependencies, and then having a target to expand the archives blindly.
Our resolve step looks like:
<target name="resolve">
<ivy:retrieve pattern="${dependency.dir}/[conf]/[artifact]/[artifact]-[revision].[ext]" conf="*" />
<condition property="archive.dir.present">
<resourceexists>
<file file="${dependency.dir}"/>
</resourceexists>
</condition>
<antcall if:set="archive.dir.present" target="expand-archives"/>
</target>
Note the separate call to the "expand-archives" target, which looks like:
<target name="expand-archives" description="Expand your Dependency Archives!">
<for param="file">
<path>
<fileset dir="${dependency.dir}" includes="**/*.tar.bz2"/>
</path>
<sequential>
<bunzip2 src="#{file}" dest="${dependency.dir}" />
</sequential>
</for>
<!-- Follow the bunzip2 by the tar command to extract the tarball -->
<for param="file">
<path>
<fileset dir="${dependency.dir}" includes="**/*.tar"/>
</path>
<sequential>
<echo message="Processing: #{file}"/>
<exec executable="tar" failonerror="true">
<arg value="-C"/>
<arg value="${dependency.dir}"/>
<arg value="-xvf"/>
<arg value="#{file}"/>
</exec>
</sequential>
</for>
</target>
What I would love to have is the dest="${dependency.dir} have a dependency's artifactID appended to it.
Is there any way to get the [artifact] information from the retrieve and pass that into the expand-archives target?
Thank you
If you have dependencies on files located within archives, perhaps you should investigate the packager resolver in ivy.
This resolver is designed to download + extract archives and then use an ANT snippet to decide which files within you want to depend on. At first glance complicated, but once understood very powerful.
The following example shows how to depend on a jar, contained inside a downloadable ".tar.gz" archive:
ivy dependency on external JAR

srcdir attributes must be set

Im trying to migrate my code from ant to gradle and imported my build.xml in build.gradle and some of my tasks work fine.
However there are some tasks when i run them it says
Execution failed for task ':compile'.
srcdir attribute must be set!
Pasting a snippet of my Build.xml and the compile task below is failing.
<project basedir="." default="deploy" name="FitNesse">
<property name="fitnesse.target" value="/build/test-fitnesse"/>
<patternset id="test.patternset">
<include name="**/*Test*.java"/>
</patternset>
<propertyset id="test.propertyset">
<propertyref name="basedir"/>
<propertyref name="test.patternset"/>
</propertyset>
<fileset id="classpath.fitnesse" dir="./libs">
<include name="antlr-2.7.7.jar"/>
<include name="asm-4.1.jar"/>
<include name="asm-analysis-4.1.jar"/>
<include name="asm-commons-4.1.jar"/>
<include name="asm-tree-4.1.jar"/
><target name="compile" description="Compile java sources" depends="clean">
<mkdir dir="build/classes"/>
<javac includeantruntime="false"/>
<javac srcdir="src/main/java" destdir="build/classes" debug="on">
<classpath refid="classpath.compile"/>
<compilerarg value="-processorpath"/>
<compilerarg value="-AmethodConstraintsSupported=true"/>
</javac>
</target>
Source folder structure
/src/main/java/com/xebia/inc/xeb
I had changed my src folder structure from ant "src" to a gradle project "/src/main/java/com/xebia/incubator/xebium". and lib folder to libs
Please help. I'm kind of novice to this.
Thanks,
The full error message should give you the line number and it's most probably the line that contains
<javac includeantruntime="false"/>
which looks like a copy-paste error.

Can't use property in ant buildfile from referenced pom

(I hope I phrased the title correctly!)
I have an ant buildfile which is referencing a maven pom like so:
<artifact:dependencies filesetId="dependency.fileset" useScope="compile">
<pom file="pom.xml"/>
</artifact:dependencies>
<copy todir="${jar.location}">
<fileset refid="dependency.fileset" />
<mapper type="flatten" />
</copy>
In pom.xml, some of the dependencies use a property in place of a hard-coded version number. But the copy task doesn't seem to resolve that property - it's trying to use "jarname-{app.version}" literally. I tried setting the value for "app.version" somewhere in the buildfile, to no effect. What am I doing wrong??
Thanks for any input!
As stated on the maven site, you should use artifact:pom to get that info:
<artifact:pom id="mypom" file="pom.xml" />
<artifact:dependencies filesetId="dependency.fileset" useScope="compile" pomRefId="mypom" />
If you have profiles to process:
<artifact:pom id="maven.project" file="pom.xml">
<profile id="my-profile"/>
</artifact:pom>

Using jarbundler ant task to add dependencies to the app

I have a Netbeans Java project. When I build my project it create a directory dist and dist/lib. It stores the Jar of the file in dist and other jar files on which the main jar file depends, in the lib directory.
Now I want to create a release for OSX. For that I am using the jarbundler ant task like this
<target name="mac">
<mkdir dir="release"/>
<taskdef name="jarbundler"
classname="net.sourceforge.jarbundler.JarBundler" />
<jarbundler dir="release"
name="MyApp"
mainClass="controller.MyApp"
jar="dist/MyApp.jar" />
</target>
This creates the app with the jar, but how do I add the dependent libraries to the app.
This is what is needed
The jar attribute should be replaced with jarfileset like this.
<target name="mac">
<mkdir dir="release"/>
<taskdef name="jarbundler"
classname="net.sourceforge.jarbundler.JarBundler" />
<jarbundler dir="release"
name="MyApp"
mainClass="controller.MyApp">
<jarfileset dir="dist">
<include name="**/*.jar" />
</jarfileset>
</jarbundler>
</target>

Resources