Hi,

Am 13.10.11 00:20, schrieb Howard Lewis Ship:
First, is there any way to read the documentation, or do a google
search, to find out that uploadPublished is provided by the java
plugin?
Have a look at http://gradle.org/current/docs/userguide/artifact_management.html There is explained how the mechanism works. The rule is upload[ConfigurationName]. for details follow the link above.


Is there an easy way to add the uploadPublished task even without
making quickstart an java module?
As mentioned before, you can manually add a uploadPublished task of type Upload:
----------
task uploadTask(type:Upload){
....
}
----------
For details about how to configure an upload task, have a look at the according DSL reference at http://gradle.org/current/docs/dsl/org.gradle.api.tasks.Upload.html

Just had a thought ... I can possibly add the necessary files as
resources of the JAR made by the quickstart module (as a java module,
with no real source files).
I would prefere to add a custom uploadPublished task as mentioned above. Applying a java plugin just for having an upload task for a specific configuration is like breaking a butterfly on a wheel ;-)


regards,
René


On Wed, Oct 12, 2011 at 3:04 PM, Rene Groeschke<[email protected]>  wrote:
Hi Howard,
The uploadPublished task is added to your build via the java plugin by a
rule. The snippet:
-----------
  if (name != "quickstart") {
    apply plugin: 'java'
    apply plugin: 'groovy'  // mostly for testing
    apply plugin: 'maven'
    apply plugin: 'project-report'
}
-----------
ensures, that the java plugin is not applied to your quickstart project.
This means that no uploadPublished task is added to your quickstart
project. so when trying to configure a non existing uploadPublished task
fails. Adding "task" in front of your 'uploadPublished' means, that a
whole new Task is created with no clue what it should do. One workaround
here is to add an else block for the quickstart project and add a custom
uploadPublished task of type (Upload).

regards,
René

The story so far:

Tapestry is a multi-module build. With help from Luke Daley, I've
managed to get all the creating of sources JARs, signing of artifacts,
and uploads to the Apache Nexus all set up.

I'm working currently on the Maven archetype; I have a quickstart
module that isn't a Java project; instead we build a


quickstart/build.gradle:

import org.apache.tools.ant.filters.FixCrLfFilter
import org.apache.tools.ant.filters.ReplaceTokens

generatedDir = new File(buildDir, 'quickstart-generated')

task generateArchetype(type: Copy) {
     srcDir = file('prototypes')

     // This let gradle know where is UP-TO-DATE
     inputs.file srcDir
     outputs.dir generatedDir

     generatedDir.mkdirs()

     from srcDir
     into generatedDir

     // Use some of the filters provided by Ant
     filter(FixCrLfFilter)
     filter(ReplaceTokens, tokens: [
             quickstartVersion: version, tapestryReleaseVersion: version,
             servletApiReleaseVersion: servletAPIVersion,
             testngReleaseVersion: testngVersion,
easymockReleaseVersion: easymockVersion
     ])

}

task build(type: Jar, dependsOn: 'generateArchetype') {

     description = "Creates a the JAR archive for the quickstart archetype"
     group = "Release artifact"

     destinationDir = buildDir
     baseName = "quickstart"
     version = project.version

     from generatedDir
}

artifacts {
     archives build
}

View it here: https://gist.github.com/1282641

That seems to be working; a gradle build will create the JAR file,
with the correct contents, as build/quickstart--xxx.jar

However, I had a lot of issues, from my top-level build.gradle;
basically things appeared to be off becuse quickstart wasn't a normal
module (it didn't even apply the 'java' plugin), so I hacked it:

description = "Apache Tapestry 5 Project"

// Remember that when generating a release, this should be
incremented. Also don't forget to
// tag the release in Subversion.
tapestryVersion = "5.3-beta-20"

jettyVersion = '7.0.0.v20091005'
tomcatVersion = '6.0.30'
testngVersion = '5.14.9'
easymockVersion = '3.0'
servletAPIVersion = '2.4'

// Provided so that Jenkins can override the normal version number for
nightly builds.
version = System.getProperty('project-version', tapestryVersion)

stagingUrl =
"https://repository.apache.org/service/local/staging/deploy/maven2/";
snapshotUrl =
"https://repository.apache.org/content/repositories/snapshots";

doSign = !project.hasProperty('noSign')&&
project.hasProperty("signing.keyId")

buildscript {
     repositories {
         mavenLocal()
         mavenRepo name: "Gradle", urls:
"http://repo.gradle.org/gradle/plugins-snapshots/";
     }
     dependencies {
         classpath
"org.gradle.plugins:gradle-signing-plugin:0.0.1-SNAPSHOT"
     }
}

allprojects {

     apply plugin: 'eclipse'
     apply plugin: 'idea'

     ideaProject {
         javaVersion = 1.5
         beforeConfigured { project ->
             project.modulePaths.clear()
         }
     }

     repositories {
         mavenCentral()

         // All things JBoss/Javassist/Hibernate
         mavenRepo urls:
"https://repository.jboss.org/nexus/content/repositories/releases/";
     }
}

subprojects {
     version = parent.version

     group = 'org.apache.tapestry'

     configurations {
         provided
         deployerJars

         // meta -- non-code artifacts, such as sources and javadoc JARs
         meta
     }

     if (name != "quickstart")
     {
         apply plugin: 'java'
         apply plugin: 'groovy' // mostly for testing
         apply plugin: 'maven'
         apply plugin: 'project-report'

         sourceCompatibility = '1.5'
         targetCompatibility = '1.5'

         // See http://jira.codehaus.org/browse/GRADLE-784

         sourceSets {
             main {
                 compileClasspath += configurations.provided
             }
             test {
                 compileClasspath += configurations.provided
                 runtimeClasspath += configurations.provided
             }
         }

         ideaModule {
             scopes.PROVIDED.plus += configurations.provided
         }

         dependencies {
             groovy "org.codehaus.groovy:groovy-all:1.7.4"

             deployerJars
"org.apache.maven.wagon:wagon-http-lightweight:1.0-beta-6"
         }

         test {
             useTestNG()

             options.suites("src/test/conf/testng.xml")

             maxHeapSize = "400M"

             // Turn off live service reloading

             systemProperties["tapestry.service-reloading-enabled"] =
"false"

             jvmArgs("-XX:MaxPermSize=512m")
         }

         task sourcesJar(type: Jar, dependsOn: classes) {
             classifier = 'sources'
             from sourceSets.main.allSource
         }

         artifacts {
             meta sourcesJar
         }

     }

     configurations {
         // published -- what gets uploaded to the Nexus repository
         published.extendsFrom archives, meta

         if (doSign)
         { published.extendsFrom signatures }
     }

     if (doSign)
     {
         apply plugin: 'signing'
         // sign (create PGP signature for) archives (standard JARs)
         // and meta (sources JARs)
         signing { sign configurations.archives, configurations.meta }
     }

     // apacheDeployUserName and apacheDeployPassword should be
specified in ~/.gradle/gradle.properties

     deployUsernameProperty = isSnapshot() ? "snapshotDeployUserName" :
"apacheDeployUserName"
     deployPasswordProperty = isSnapshot() ? "snapshotDeployPassword" :
"apacheDeployPassword"
     canDeploy = [deployUsernameProperty, deployPasswordProperty].every
{ project.hasProperty(it) }

     uploadPublished {

         doFirst {
             if (!canDeploy)
             {
                 throw new InvalidUserDataException("Missing upload
credentials. Set '$deployUsernameProperty' and
'$deployPasswordProperty' project properties.")
             }
         }

         if (canDeploy)
         {
             repositories {

                 project.deployer = repositories.mavenDeployer {

                     if (doSign)
                     {
                         beforeDeployment { MavenDeployment deployment ->
                             def signedPomArtifact =
sign(deployment.pomArtifact).singleArtifact
                             // See
http://issues.gradle.org/browse/GRADLE-1589
                             signedPomArtifact.type = "pom." +
signing.type.extension
                             deployment.addArtifact(signedPomArtifact)
                         }
                     }

                     repository(url: stagingUrl) {
                         authentication(userName:
project.getProperty(deployUsernameProperty), password:
project.getProperty(deployPasswordProperty))
                     }

                     snapshotRepository(url: snapshotUrl) {
                         authentication(userName:
project.getProperty(deployUsernameProperty), password:
project.getProperty(deployPasswordProperty))
                     }
                 }
             }
         }
     }
}

// Specific to top-level build, not set for subprojects:

configurations {
     javadoc
     published.extendsFrom archives, meta
     if (doSign)
     { published.extendsFrom signatures }
}

dependencies {
     javadoc project(':tapestry-javadoc')
}

subprojects.each { project.evaluationDependsOn(it.name) }

// Cribbed from
https://github.com/hibernate/hibernate-core/blob/master/release/release.gradle#L19

javadocBuildDir = dir(buildDirName + "/documentation/javadocs")

task aggregateJavadoc(type: Javadoc, group: "Documentation") {

     dependsOn configurations.javadoc

     description = "Build the aggregated JavaDocs for all modules"
     maxMemory = '512m'
     destinationDir = javadocBuildDir.dir
     configure(options) {
         // overview = new File( projectDir, 'src/javadoc/package.html' )
         stylesheetFile = new File(projectDir,
'src/javadoc/stylesheet.css')
         windowTitle = 'Tapestry API Documentation'
         docTitle = "Tapestry JavaDoc ($project.version)"
         bottom = "Copyright&copy; 2003-2011<a
href=\"http://tapestry.apache.org\";>The Apache Software
Foundation</a>."
         use = true
         links = ['http://download.oracle.com/javase/6/docs/api/',
'http://download.oracle.com/javaee/6/api/']
         addStringOption "tagletpath", configurations.javadoc.asPath
         addStringOption "taglet",
"org.apache.tapestry5.javadoc.TapestryDocTaglet"

         exclude "org/apache/tapestry5/internal/plastic/asm/**"
     }

     subprojects.findAll({ sp ->  sp.name != "quickstart" }).each { sp ->
         sp.sourceSets.all.findAll { set ->  set.name != "test" }.each { set
->

             source set.java

             classpath += set.classes + set.compileClasspath

             // Some of the component .xdoc files refer to PNG images
             // (we could also exclude .java and .xdoc)
             copy {
                 from set.java.srcDirs.toList()
                 into javadocBuildDir.dir
                 include '**/*.png'
             }
         }
     }
}

aggregateJavadoc.doLast {
     copy {
         from new File(projectDir, 'src/javadoc/images')
         into new File(javadocBuildDir.dir, "/images")
     }
}

task clean(type: Delete) {
     delete buildDirName
}

task continuousIntegration(dependsOn: [subprojects.build,
'aggregateJavadoc', subprojects.uploadPublished],
         description: "Task executed on Jenkins CI server after SVN
commits")

task generateRelease(dependsOn: ['continuousIntegration',
subprojects.uploadPublished, 'zippedSources', 'zippedJavadoc'],
         group: "Release artifact",
         description: "Generates and uploads a final release to Apache
Nexus")

task wrapper(type: Wrapper) {
     gradleVersion = '1.0-milestone-3'
     description = "Regenerates the Gradle Wrapper files"
}

task zippedSources(type: Zip) {
     description = "Creates a combined Zip file of all sub-project's
sources"
     group = "Release artifact"

     destinationDir = buildDir
     baseName = "apache-tapestry"
     version = project.version
     classifier = "sources"

     from project.projectDir
     exclude "**/.*/**"
     exclude "**/bin/**"
     exclude "**/target/**"
     exclude "**/build/**"
     exclude "**/test-output/**"  // Left around by TestNG sometimes
}

task zippedJavadoc(type: Zip, dependsOn: aggregateJavadoc) {
     description = "Zip archive of the project's aggregate JavaDoc"
     group = "Release artifact"

     destinationDir = buildDir
     baseName = "apache-tapestry"
     version = project.version
     classifier = "javadocs"

     from javadocBuildDir.dir
     into "apidocs"
}

boolean isSnapshot()
{
     project.version.contains('SNAPSHOT')
}


https://gist.github.com/1282666

It's a bit ugly (suggestions welcome), but basically skips a bunch of
setup that occurs in most modules for the "quickstart" module.

Mostly it works fine, except for the uploadPublished task, as defined
starting on line 143.

When I try to build, I get an exception:

$ gr genR -x test
Note: the Gradle build daemon is an experimental feature.
As such, you may experience unexpected build failures. You may need to
occasionally stop the daemon.

FAILURE: Build failed with an exception.

* Where:
Build file '/Users/hlship/workspaces/tapestry/tapestry5/build.gradle'
line: 143

* What went wrong:
A problem occurred evaluating root project 'tapestry5'.
Cause: Could not find method uploadPublished() for arguments
[build_13a7g2thd0j4oqok73diap6lkl$_run_closure2_closure25@5c304dd3] on
root project 'tapestry5'.

* Try:
Run with --stacktrace option to get the stack trace. Run with --info
or --debug option to get more log output.

BUILD FAILED

Total time: 0.89 secs
~/workspaces/t5
$


More details here: https://gist.github.com/1282681

If I add "task " to the start of the line (to clearly indicate the
uploadPublished is supposed to be a new task added to the subproject),
it works, but uploadPublished doesn't seem to do anything.  Perhaps
this way it overwrites the uploadPublished task normally added by the

:tapestry-yuicompressor:jar UP-TO-DATE
:tapestry-yuicompressor:sourcesJar UP-TO-DATE
:tapestry-yuicompressor:assemble UP-TO-DATE
:tapestry-yuicompressor:check
:tapestry-yuicompressor:build
:tapestry-yuicompressor:uploadPublished
:tapestry5-annotations:sourcesJar UP-TO-DATE
:tapestry5-annotations:assemble UP-TO-DATE
:tapestry5-annotations:check
:tapestry5-annotations:build
:tapestry5-annotations:uploadPublished
:continuousIntegration
:zippedJavadoc UP-TO-DATE
:zippedSources
:generateRelease


... see, it appears to have executed, but it certainly didn't upload
anything to Nexus.

I've tried a few things, such as reoganizing things to push the
uploadPublished task definition further up but no dice.

I'm going to dig a little deeper and see if there's an alternate way
of dealing with quickstart specially.  Any help would be appreciated!

--
Howard M. Lewis Ship

Creator of Apache Tapestry

The source for Tapestry training, mentoring and support. Contact me to
learn how I can get you up and productive in Tapestry fast!

(971) 678-5210
http://howardlewisship.com

---------------------------------------------------------------------
To unsubscribe from this list, please visit:

     http://xircles.codehaus.org/manage_email





---------------------------------------------------------------------
To unsubscribe from this list, please visit:

    http://xircles.codehaus.org/manage_email







--
-----------------------
regards,
René

rene groeschke
http://www.breskeby.com
@breskeby


---------------------------------------------------------------------
To unsubscribe from this list, please visit:

   http://xircles.codehaus.org/manage_email


Reply via email to