So I added the following to my build.gradle:

task copyToLib(dependsOn: configurations.default.buildArtifacts, type: Copy)
> {

    into('build/output/lib')

    from configurations.default

    from configurations.default.allArtifacts*.file

}


Then I ran:
$ gradle build
$ gradle copyToLib

Next I tried to run the JAR...
$ cd build\output\lib
$ dir

 Directory of C:\work\projects\playground\mrhakibook\build\output\lib

01/18/2010  08:41 PM    <DIR>          .
01/18/2010  08:41 PM    <DIR>          ..
07/09/2008  03:04 PM         1,323,005 ant-1.7.1.jar
07/09/2008  03:04 PM            12,143 ant-launcher-1.7.1.jar
01/13/2007  01:28 AM           445,288 antlr-2.7.7.jar
08/27/2006  08:49 PM            34,832 asm-2.2.3.jar
08/27/2006  08:49 PM            17,977 asm-analysis-2.2.3.jar
08/27/2006  08:49 PM            16,248 asm-tree-2.2.3.jar
08/27/2006  08:49 PM            34,989 asm-util-2.2.3.jar
12/02/2009  07:11 AM         3,987,117 groovy-1.6.7.jar
02/22/2008  02:53 PM            87,325 jline-0.9.94.jar
03/03/2006  06:22 PM           120,640 junit-3.8.2.jar
01/18/2010  08:41 PM            30,589 foo-1.0-SNAPSHOT.jar

$ java -jar foo-1.0-SNAPSHOT.jar

and I get..

Exception in thread "main" java.lang.NoClassDefFoundError:
groovy/lang/GroovyObject
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(Unknown Source)
        at java.security.SecureClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.access$000(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClassInternal(Unknown Source)
Caused by: java.lang.ClassNotFoundException: groovy.lang.GroovyObject
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClassInternal(Unknown Source)
        ... 12 more
Could not find the main class: org.mindscratch.foo.ParseMain. Program will
exit.

I'm not sure why it can't find "GroovyObject"...the JAR is in the same
directory as my "foo" jar.

I tried this as well:

$ java -cp . org.mindscratch.foo.ParseMain     ....and I get:

Exception in thread "main" java.lang.NoClassDefFoundError:
org/mindscratch/foo/ParseMain
Caused by: java.lang.ClassNotFoundException: org.mindscratch.foo.ParseMain
        at java.net.URLClassLoader$1.run(Unknown Source)

I did verify the ParseMain class does exist in my "foo" jar.

Thanks in advance.
craig

On Sun, Jan 17, 2010 at 6:27 PM, Adam Murdoch <[email protected]> wrote:

>
>
> On 18/01/10 4:15 AM, Craig Wickesser wrote:
>
> I'm trying to get an executable JAR that contains groovy code that I can
> run by doing a simple: java -jar myapp.jar
>
>  Here's my build.gradle
>
>  usePlugin 'groovy'
> usePlugin 'maven'  // Maven plugin to install artifact in local Maven repo.
>
>  sourceCompatibility = '1.6'
> targetCompatibility = '1.6'
>
>  manifest.mainAttributes("Main-Class" : "org.mindscratch.foo.ParseMain")
>
>  def localMavenRepo = 'file://' + new
> File(System.getProperty('user.home'), '.m2/repository').absolutePath
> repositories {
>     // Use local Maven repo location. We don't need this if we only want to
> install
>     // an artifact, but we do need it if we want to use dependencies from
> the local
>     // repository.
>     mavenRepo urls: localMavenRepo
> }
>
>  // Project configuration:
> version = '1.0-SNAPSHOT'
> group = 'org.mindscratch.foo'
>
>  // The following line is not necessary. Default the install tasks depends
> on the
> // jar task, but this means no tests and checks are executed when we use
> the
> // install task. The following line makes the install tasks depend on the
> build task
> // and now all tests and checks are done before install is executed.
> install.dependsOn ':build'
>
>
>  repositories {
>     mavenCentral()  // Define Maven central repository to look for
> dependencies.
> }
>
>  dependencies {
>     groovy 'org.codehaus.groovy:groovy:1.6.7'  // group:name:version is a
> nice shortcut notation for dependencies.
>     testCompile 'junit:junit:4.7'
> }
>
>
>  task initProject(description: 'Initialize project directory structure.')
> << {
>     // Default package to be created in each src dir.
>     def defaultPackage = 'org/mindscratch/foo'
>
>     ['java', 'groovy', 'resources'].each {
>         // convention.sourceSets contains the directory structure
>         // for our Groovy project. So we use this struture
>         // and make a directory for each node.
>         convention.sourceSets.all."${it}".srcDirs*.each { dir ->
>             def newDir = new File(dir, defaultPackage)
>             logger.info "Creating directory $newDir"  // gradle -i shows
> this message.
>             newDir.mkdirs()  // Create dir.
>         }
>     }
> }
>
>
>  I run:
> $ gradle install -i
> $ cd build/libs
> $ java -jar foo-1.0-SNAPSHOT.jar
>
>  ..doesn't work b/c the Groovy jar isn't on the classpath (or inside my
> JAR).  GUess what I need is a JAR that contians the Groovy jar inside of it
> (maybe in a "lib" folder).  Can you help?
>
>
> The cookbook has some options for creating a JAR which contains its compile
> or runtime dependencies:
> http://docs.codehaus.org/display/GRADLE/Cookbook#Cookbook-Creatingafatjar
>
> There's also a JIRA issue for making this easier:
> http://jira.codehaus.org/browse/GRADLE-566
>
>
> --
> Adam Murdoch
> Gradle Developerhttp://www.gradle.org
>
>

Reply via email to