Hi Hans,
thank you very much! I will play around with that and see what I can make of
it.
So far I have two questions (after typing that from my smartphone screen
while sitting in a train)
What's the deal with the AntDirective? Will a simple "ant.mkdir(dir:someDir)
[for example] not also work? I haven't seen this in the documentation (not
even the 0.1.4)
Also, your script creates another "myfat_jar" in addition to the existing
"myclass_jar" and "libs" obviously depends on both. How do those two
"interact" and could there be conflicts, i.e. if I added different manifest
instructions?
I assume the last jar instruction called would win, am I right?
BTW a "merge files" would be great!
Martin
On Wed, May 7, 2008 at 10:49 AM, Hans Dockter <[EMAIL PROTECTED]> wrote:
> Hi Martin,
> On May 6, 2008, at 10:49 AM, Hans Dockter wrote:
>
> 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)}
>
>
> the new lines got swallowed. Here a readable version:
>
> usePlugin('java')
> version = '1.0'
> sourceCompatibility = 1.5
> targetCompatibility = 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
>
>
>
>
>
> --
> Hans Dockter
> Gradle Project lead
> http://www.gradle.org
>
>
>
>
>