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
>
>