Hi Martin,

now the second part of my answer.

You could build your project like this:

usePlugin('java')
version = '1.0'
sourceCompatibility = 1.5targetCompatibility = 1.5
dependencies { addFlatDirResolver('lib', file('libs')) clientModule(['groovy'], ":groovy-all:1.6-beta-1") { dependency (":commons-cli:1.0") } testCompile ":junit:4.4"} libs.jar('myfat') { fileSet(dir: classesDir) AntDirective antDirective = new AntDirective() antDirective.directive = { zipgroupfileset(dir: new File(rootDir, 'lib')) } resourceCollections << antDirective manifest.mainAttributes('Main- Class': 'org.myproject.Main')} This is all you need. And you have dependency management which we think is something very valuable (see the chapter on dependencies). Its is not a thrilling yet I think a reasonable solution for your problem. In the next release of Gradle we want to offer a merge function where you can say:
my_jar {   merge(someJarFiles)}

That would be pretty nice.

But there will be always features that are missing, It is essential that Gradle offers the flexibility to add custom behavior when there is no explicit support for a certain functionality.

We spend a lot of effort into our documentation. But the handling of archives deserves more coverage.

- Hans

P.S Here is the more or less corresponding Gant script (from Martin's mail to the Groovy user list):

// PrecheckinggroovyHome = System.getenv( ).'GROOVY_HOME'if ((groovyHome == null) || (groovyHome == '')) { println ('GROOVY_HOME is not set, so a build cannot happen.') return}

// Setup directories, mostly according to Maven/Cradle
final sourceDir = 'src/main/groovy'final libDir = 'src/lib'final buildDir = 'build'final buildClassesDir = buildDir + '/classes' final buildMetadataDir = buildClassesDir + '/META-INF' // Setup infofinal projectName = 'Scriptcopy'final projectPackage = 'de.martinstephan'final projectMainClass = 'Scriptcopy'final projectPath = projectPackage.replace('.', '/')final jarPath = "$ {buildDir}/${projectName}.jar"final version = '0.1.0'
//  Set up all the targets.

includeTool << gant.tools.Execute
target(init: 'Init source directories.') { Ant.mkdir(dir: 'src/ main/groovy')} target(clean: 'Delete the compiled classes.') { delete(dir: buildDir)} Ant.taskdef(name: 'groovyc', classname: 'org.codehaus.groovy.ant.Groovyc')target(compile: 'Compile everything.' ) { depends(clean) Ant.mkdir(dir: buildClassesDir) Ant.groovyc(srcdir: sourceDir , destdir: buildClassesDir)} target(jar: 'Put everything in a jar') { depends(compile) Ant.jar(destfile: jarPath, compress: true, index: true ) { fileset(dir: buildClassesDir, includes: "**/ *.class") zipgroupfileset(dir: groovyHome, includes: 'embeddable/groovy-all-*.jar') zipgroupfileset(dir: groovyHome, includes: 'lib/commons-cli-*.jar') // zipgroupfileset(dir: libdir, includes: '*.jar' ) // add more jars here manifest { attribute(name: 'Main-Class', value: "${projectPackage}.${projectMainClass}") } }} target(test: 'Test after compiling and jaring..') { depends (jar) Ant.java(jar: jarPath, fork: true) { arg(value: '- s') arg(value: 'testscript.xml') //arg(value: '- h') }} target(_test: 'Test only..') { Ant.java(jar: jarPath, fork: true) { arg(value: '-s') arg(value: 'testscript.xml') //arg(value: '-h') }}



On May 6, 2008, at 1:01 AM, Hans Dockter wrote:
Hi Martin,

sorry for not answering earlier. I was very busy with the release.

On May 5, 2008, at 10:58 PM, Martin Stephan wrote:
Hi,

this is a message I actually posted on groovy-user in the topic "Gradle usage", however it might be more suitable for this list. Maybe someone could enlighten me. Even an RTFM with the pointer to suitable documentation would be appreciated as I wasn't able to find any books/articles that actually discuss the topic ant vs maven vs gmaven vs gant vs mojo vs gradle vs ivy whatnot. I suppose I could leave all the 'Gs' out of the equation and simply decide if like ant (+ivy) better than maven or the other way around. However, from what I read, gradle seems to be a new animal in that regard, as it seems to try a best of *all* worlds approach..

---

I actually am confronted with the same decision. Gant or Gradle, that is. So far I always used the build support of my IDE for the little tools I write for my job. But since I'm trying new stuff with groovy, I thought, I might go all the way and started looking into ant, maven, gant, gradle.

Long story short, I started with gradle. Worked okaish for me, since it was nice to have prepared targets but my problem was that the didn't quite do what I wanted, i.e. the jar target (myclass_jar) jars everything including the libs alright, but doesn't create a 'fat jar' with groovy-embeddable-*.jar.

So, I figured, I needed to modify that target, but didn't know how. Or maybe use dependencies, but wasn't too sure about that either, especially since I don't have any maven or ivy repos yet. So I thought about creating a new target which did what I wanted. This I can do in gant and gradle, but doing that in gradle would make all the standardization quite useless, I think.

Now I have a working build.gant file which does exactly what I want, but I'm still wondering if I could have done all that in gradle while keeping it 'standardized' somehow.

Gradle is a general purpose build tool. It has all the flexibility offered by Ant or Gant or other general purpose build tools. Its perfectly suitable for non standardized Ant scripting if this is the best way to do the job.

On top of this general purpose layer Gradle has a build-by- convention framework. It is very important to see that Gradle _is_ not a build-by-convention build tool. It just offers also build-by- convention behavior. The build problem space is complex. We think build-by-convention makes only sense, if it let you do the things not captured by the framework in an easy way.

Unfortunately I'm very tired right now. Therefore I gonna send a second mail tomorrow showing how to create your fat jar with Gradle.

Thanks for your patience

- Hans



I would be very grateful for any hints. I suppose I missed some important parts of the gradle documentation..

Martin

--
Hans Dockter
Gradle Project lead
http://www.gradle.org





--
Hans Dockter
Gradle Project lead
http://www.gradle.org




Reply via email to