Hi Tim, Lee, Wayne, and Jean-Laurent, I've gotten the packaging of a stand-alone app working correctly now! Thank you all so very much.
The reason I was getting the extra copies of dependency jars rolled into the executable one was that, in my earlier thrashings about I had put copies of the jar files down in /src/main/resources/lib, and then forgot that they were there. The reason I was getting an extra copy of the executable zipped into the /lib directory in the distributable was that I didn't have the exclude for ${groupId}:${artifactId} configured into the assembly descriptor. Thanks again. Now I'll go to the Wiki to share what I've learned about building stand-alone apps. Thanks, --Erik -----Original Message----- From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On Behalf Of Lee Meador Sent: Friday, June 02, 2006 4:32 PM To: Maven Users List Subject: Re: Stand-alone app Thank you. My setup, so similar to yours, generates things organized as you want. That's what I want as well. I don't know why yours doesn't. Sometimes knowing that someone else is doing something similar to what you are doing and they get the right results is useful. So the real question is what are you doing (or not doing) that causes the dependency jars to get put into your executable jar? On 6/2/06, Tim Kettler <[EMAIL PROTECTED]> wrote: > > Erik, > > I have sent you the project in a private mail too. Have you received > that? > > However, I misunderstood you until now. I thought your only problem > was the dependencies in the executable jar and not the duplicate > executable jar in the created assembly. I get > this as well. I will send you another test project per private mail. Can > you run that and > tell if it produces everything as expected. > > -Tim > > > Midtskogen, Erik schrieb: > > Hi Tim, > > > > I'm sorry, but I didn't receive the attachment. It only came > > through as what looked like the end of a text message. I suspect > > that some firewall must have intervened and deleted the bulk of the > > attachment. > > > > Also, I was wrong about getting exactly what I wanted in the root > > directory from the existing assembly configuration. That zip file > > that I got that I said was perfect was just a copy of my hand-edited > > file left-over from earlier. > > > > Yes, the ./target/pairfinder-0.9-stand-alone-app.zip file does work, > > and I could use it just the way it is. But it is much larger than > > it needs to be. If you unzip it and then examine the contents, > > you'll find that it contains two duplicate copies of > > pairfinder-0.9.jar. One is located at > > pairfinder-0.9/pairfinder-0.9.jar, and the other is located at > > pairfinder-0.9/lib/pairfinder-0.9.jar. > > > > Not only that, but each of those duplicate copies of > > pairfinder-0.9.jar contain all the dependency jar libraries rolled > > up inside themselves where they do nothing other than take up space. > > The net result is that the zip file generated by the > > assembly:assembly mvn command is 14.1MB in size, while the result > > after I have edited out all the unwanted copy of pairfinder-0.9.jar > > and the unwanted dependency jars from the other copy of > > pairfinder-0.9.jar and then zip everything back up, the resulting > > zip file is 3.4MB. And the larger this project gets, the larger > > that distributable will get--multiplied by three. > > > > That's why I'm still looking into writing a goal. Even if it turns > > out to be possible to get what I want, it should be easier than > > spending days messing with it. > > > > Thanks, > > --Erik > > > > > > > > -----Original Message----- > > From: Tim Kettler [mailto:[EMAIL PROTECTED] > > Sent: Friday, June 02, 2006 2:08 PM > > To: Maven Users List > > Subject: Re: Stand-alone app > > > > > > Midtskogen, Erik schrieb: > >> Hi Tim, > >> > >> Ohhh! I think I see what's happening. I was expecting the final > >> result zip file to appear under the ./target directory instead of > >> right in the root directory. After running assembly:assembly there > >> is > > > >> a zip file under the ./target directory with a somewhat longer name > >> "pairfinder-0.9-stand-alone-app.zip", and this zip file is quite > >> large > > > >> because it has the redundant copies of the jar files. I thought > >> this was the final artifact of the assembly:assembly goal. I > >> didn't notice > > > >> the pairfinder-0.9.zip file sitting right in the root, and this > >> file is the correct file to distribute the app. It's exactly what > >> I wanted. > > > > This isn't the result I am getting. > > > > There are two files generated in the target directory: > > pairfinder-0.9.jar and pairfinder-0.9-stand-alone-app.zip. There is > > no third file generated in the root directory > > of the project. > > > > The jar just contains the compiled classes and the manifest with the > > Class-Path entry. And the zip contains the build artifact and its > > dependencies... Exactly as wanted. > > > > I have attached the test project I created. Can you try to run 'mvn > > assembly:assambly' on that and see what it produces for you. > > > >> Well, thank you so much! > >> > >> Even though this jar:jar/assembly:assembly combination does work, > >> I'm still looking into writing an explicit goal for accomplishing > >> this task. The fact that lots of people are probably going to want > >> to do this, but yet it took me (a beginning user, in case you > >> couldn't tell) > > > >> several days of fumbling to get it right is an indication that > >> there may be a need for it. I agree that It's not difficult to use > >> the jar and assembly to create a stand-alone build once you > >> understand how to do it. But I think it could be even easier with a > >> goal. Even if nobody else has any need for it, at least I'm > >> learning a lot about how > > > >> Maven works by doing it. And maybe other people would like it, > >> too. Especially Maven beginners like me :-) > >> > >> Do you think I should look into writing it as a goal/mojo under the > >> assembly plugin, in the hopes that maybe I could submit it to the > >> Maven Project, or should I write it into my own plugin that I write > >> from scratch? > > > > As Wayne said, writing a small guide to help other new users seems > > more appropriate. > > > >> Thanks so much! > >> --Erik > >> > >> -----Original Message----- > >> From: Tim Kettler [mailto:[EMAIL PROTECTED] > >> Sent: Friday, June 02, 2006 11:52 AM > >> To: Maven Users List > >> Subject: Re: Stand-alone app > >> > >> > >> Just to be sure I understand you correctly: Your problem is that > >> the dependendcies of your project are included in in the created > >> jar artifact ('pairfinder-0.9.jar')? > >> > >> I ask this because I can't reproduce your problem with the > >> pom/descriptor you posted. I just replaced your internal dependency > >> with a dependency to commons-beanutils. When I now run 'mvn > >> assembly:assembly' the artifact is created with the right classpath > >> entries in the manifest and the zip file has the dependencies in > >> the lib > > directory > >> ??????? > >> > >> Have you tried to run a 'mvn clean' before creating the assembly? > >> > >> -Tim > >> > >> Midtskogen, Erik schrieb: > >>> Hi Tim, > >>> > >>> Hi Tim. Yes, I'm using the assembly plugin to copy the > >>> dependencies into a subdirectory called "./lib", and I'm using the > >>> jar plugin to build the executable jar, and actually everything > >>> works basically OK. > > > >>> My only problem is that the jar plugin is adding the dependency > >>> jar files into the executable artifact jar. These are unnecessary > >>> and only increase the size of executable jar file. There is no > >>> way I've found to put a jarred jar library onto the classpath > >>> without writing extra code in your executable to support this. > >>> The jar libraries > > need > >>> to reside outside the executable jar in the normal filesystem to > >>> be easily accessible. > >>> > >>> For now, I'm just removing the unneeded dependency jars from the > >>> executable jar manually, but I'm curious how one might go about > >>> configuring jar:jar so that it properly configures the manifest.mf > >>> without also rolling the dependency jars into its artifact. > >>> > >>> Here is my POM: > >>> > >>> <project xmlns="http://maven.apache.org/POM/4.0.0" > >>> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" > >>> xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 > >>> http://maven.apache.org/maven-v4_0_0.xsd"> > >>> <modelVersion>4.0.0</modelVersion> > >>> <groupId>com.galaxyusa.pairfinder</groupId> > >>> <artifactId>pairfinder</artifactId> > >>> <packaging>jar</packaging> > >>> <version>0.9</version> > >>> <name>Maven Quick Start Archetype</name> > >>> <url>http://maven.apache.org</url> > >>> <dependencies> > >>> <dependency> > >>> <groupId>junit</groupId> > >>> <artifactId>junit</artifactId> > >>> <version>3.8.1</version> > >>> <scope>test</scope> > >>> </dependency> > >>> > >>> <dependency> > >>> <groupId>org.skroople</groupId> > >>> <artifactId>skroople</artifactId> > >>> <version>0.7</version> > >>> </dependency> > >>> > >>> </dependencies> > >>> > >>> <build> > >>> <pluginManagement> > >>> <plugins> > >>> <plugin> > >>> > >>> <groupId>org.apache.maven.plugins</groupId> > >>> > >>> <artifactId>maven-compiler-plugin</artifactId> > >>> <version>2.0</version> > >>> <configuration> > >>> <source>1.5</source> > >>> <target>1.5</target> > >>> </configuration> > >>> </plugin> > >>> > >>> <plugin> > >>> > >>> <groupId>org.apache.maven.plugins</groupId> > >>> > >>> <artifactId>maven-jar-plugin</artifactId> > >>> <configuration> > >>> <archive> > >>> <manifest> > >>> > >>> <mainClass>com.galaxyusa.pairfinder.PairFinder</mainClass> > >>> > >>> <addClasspath>true</addClasspath> > >>> > >>> <classpathPrefix>lib</classpathPrefix> > >>> </manifest> > >>> </archive> > >>> </configuration> > >>> </plugin> > >>> > >>> <plugin> > >>> > >>> <groupId>org.apache.maven.plugins</groupId> > >>> > >>> <artifactId>maven-assembly-plugin</artifactId> > >>> <configuration> > >>> <descriptors> > >>> > >>> <descriptor>src/main/assembly/stand-alone-app.xml</descriptor> > >>> </descriptors> > >>> </configuration> > >>> </plugin> > >>> </plugins> > >>> </pluginManagement> > >>> </build> > >>> </project> > >>> > >>> The assembly configuration descriptor is this: > >>> > >>> <assembly> > >>> <id>stand-alone-app</id> > >>> <formats> > >>> <format>zip</format> > >>> </formats> > >>> <fileSets> > >>> <fileSet> > >>> <directory>target</directory> > >>> <outputDirectory>.</outputDirectory> > >>> <includes> > >>> <include>*.jar</include> > >>> </includes> > >>> </fileSet> > >>> </fileSets> > >>> <dependencySets> > >>> <dependencySet> > >>> <outputDirectory>/lib</outputDirectory> > >>> <unpack>false</unpack> > >>> <scope>runtime</scope> > >>> </dependencySet> > >>> </dependencySets> > >>> </assembly> > >>> > >>> Note: this project has a number of transitive dependencies that > >>> come through the dependency for "skroople". > >>> > >>> So far, it's still feeling to me like there should be a goal in > >>> the assembly plugin that handles building a standalone app and > >>> optionally > > > >>> zips it up into a zip file or tarball, depending on the platform. > >>> It > > > >>> could even have sensible defaults such that if you're happy enough > >>> with a stand-alone app set up the way I'm doing it here, (with the > > jar > >>> library dependencies copied into ./lib) all you would have to do > >>> is tell it what your main class is, and then type "mvn > >>> assembly:stand-alone-app", and you're done. > >>> > >>> Yes, I can see that it is possible to accomplish this if you > >>> configure the jar:jar and the assembly:assembly goals just so, and > >>> also roll your own assembly configuration descriptor. But that > >>> seems like more > > > >>> work than should be necessary for such basic functionality. Maven > >>> is > > > >>> supposed to make the most common tasks easy to do. > >>> > >>> I have looked into the OneJar project. I can't remember exactly > >>> why I didn't get into it, but I seem to remember that it was a bit > >>> intrusive. You had to write some special code to support it or > >>> something like that. Having all the dependencies inside the same jar > >>> is the main point of OneJar, but that objective isn't all that > >>> important to me. I'm happy enough just to have the dependencies > >>> sitting outside the main executable. > >>> > >>> So, I will start reading about how to write Maven goals and see if > >>> I can come up with something easy to use. If I'm successful, then > > maybe > >>> the Maven folks would accept my goal and include it in the > >>> assembly plugin. One can dream... > >>> > >>> Vielen Dank! > >>> --Erik > >>> > >>> -----Original Message----- > >>> From: Tim Kettler [mailto:[EMAIL PROTECTED] > >>> Sent: Friday, June 02, 2006 1:11 AM > >>> To: Maven Users List > >>> Subject: Re: Stand-alone app > >>> > >>> > >>> Hi, > >>> > >>> I think my suggestion regarding the use of the > >>> dependency-maven-plugin could have been a little bit > >>> confusing/misleading. Did you configure it to copy the > >>> dependencies somewhere under your target/classes folder? I wanted > >>> to mention the OneJar > >> project > >>> (http://one-jar.sourceforge.net/) for this usecase but somewhow > >>> forgot. > >>> > >>> If you use the assembly-plugin to build your distribution you > >>> probably won't need the dependency-plugin at all. Do you use it? > >>> If not: Can you post your pom so that we can have > >>> a look at it to figure out what is going wrong? > >>> > >>> -Tim > >>> > >>> Midtskogen, Erik schrieb: > >>>> Hi Tim and Jean-Laurant, > >>>> > >>>> Thanks so much for your suggestions. I'm very close now, but I'm > >>>> still confused about a couple of things. > >>>> > >>>> After following your suggestions, the jar:jar now adds the > >>>> correct manifest.mf settings and pulls the correct dependencies > >>>> out of the repository. Bravo!! But the problem is that it is > >>>> jarring up the dependency jars into the executable jar file > >>>> itself instead of adding them to a subdirectory in the file > >>>> system. When I run the assembly:assembly goal, it does add the > >>>> jar files to the zip file in > > > >>>> the correct location, so my app does work when you unzip it and > >>>> run it. No complaints there. But I'd rather not duplicate the > >>>> jar entries into the executable jar file, because it almost > >>>> doubles the size of my distributable. > >>>> > >>>> Why would one want dependency jar files jarred into the > >>>> executable jar anyway? I'm confused. It doesn't seem that Java > >>>> is able to place such a jarred dependency onto the classpath > >>>> without special coding > > in > >>>> the app itself to do this. You're supposed to run your > >>>> executable in one jar file, and keep your library dependencies as > >>>> separate jar files, no? Am I wrong about this? Is there any way > >>>> of suppressing the addition of the dependencies from being added > >>>> to the executable jar during the package lifecycle (jar:jar), > >>>> while still adding the dependency classpath entries into the > >>>> manifest.mf? > >>>> > >>>> Thanks! > >>>> --Erik > >>>> > >>> [...] > >>> > >>> ------------------------------------------------------------------ > >>> --- > >>> To unsubscribe, e-mail: [EMAIL PROTECTED] > >>> For additional commands, e-mail: [EMAIL PROTECTED] > >>> > >>> > >>> ****************************************************************** > >>> *** > >>> * > >>> ************* > >>> The information in this email (including any attachments) is > >> confidential and may be legally privileged. Access to this e-mail > >> by anyone other than the intended addressee is unauthorized. If > >> you are not the intended recipient of this message, any review, > >> disclosure, copying, distribution, retention, or any action taken > >> or omitted to be > > > >> taken in reliance on it (including any attachments) is prohibited > >> and may be unlawful. If you are not the intended recipient, please > >> reply to or forward a copy of this message to the sender and delete > >> the message, all attachments, and any copies thereof from your > >> system and destroy any printout thereof. > >>> __________________________________________________________________ > >>> ___ > >>> _ > >>> The information in this email (including any attachments) is > >>> confidential and may be legally privileged. Access to this e-mail by > >>> anyone other than the intended addressee is unauthorized. If you are > >>> not the intended recipient of this message, any review, disclosure, > >>> copying, distribution, retention, or any action taken or omitted to > > be > >>> taken in reliance on it (including any attachments) is prohibited > >>> and may be unlawful. If you are not the intended recipient, please > >>> reply to or forward a copy of this message to the sender and > >>> delete the message, all attachments, and any copies thereof from > >>> your system and > > > >>> destroy any printout thereof. > >>> > >>> ------------------------------------------------------------------ > >>> --- > >>> To unsubscribe, e-mail: [EMAIL PROTECTED] > >>> For additional commands, e-mail: [EMAIL PROTECTED] > >>> > >>> > >> > >> ------------------------------------------------------------------- > >> -- > >> To unsubscribe, e-mail: [EMAIL PROTECTED] > >> For additional commands, e-mail: [EMAIL PROTECTED] > >> > >> > >> ******************************************************************* > >> *** > >> ************* > >> The information in this email (including any attachments) is > > confidential and may be legally privileged. Access to this e-mail > > by anyone other than the intended addressee is unauthorized. If you > > are not the intended recipient of this message, any review, > > disclosure, copying, distribution, retention, or any action taken or > > omitted to be taken in reliance on it (including any attachments) is > > prohibited and may be unlawful. If you are not the intended > > recipient, please reply to or forward a copy of this message to the > > sender and delete the message, all attachments, and any copies > > thereof from your system and destroy any printout thereof. > >> ___________________________________________________________________ > >> ___ > >> The information in this email (including any attachments) is > >> confidential and may be legally privileged. Access to this e-mail by > >> anyone other than the intended addressee is unauthorized. If you are > >> not the intended recipient of this message, any review, disclosure, > >> copying, distribution, retention, or any action taken or omitted to be > > > >> taken in reliance on it (including any attachments) is prohibited > >> and may be unlawful. If you are not the intended recipient, please > >> reply to or forward a copy of this message to the sender and delete > >> the message, all attachments, and any copies thereof from your > >> system and destroy any printout thereof. > >> > >> ------------------------------------------------------------------- > >> -- > >> To unsubscribe, e-mail: [EMAIL PROTECTED] > >> For additional commands, e-mail: [EMAIL PROTECTED] > >> > >> > > > > > > > > > ********************************************************************** > ************* > > The information in this email (including any attachments) is > confidential and may be legally privileged. Access to this e-mail by > anyone other than the intended addressee is unauthorized. If you are > not the intended recipient of this message, any review, disclosure, > copying, distribution, retention, or any action taken or omitted to be > taken in reliance on it (including any attachments) is prohibited and > may be unlawful. If you are not the intended recipient, please reply > to or forward a copy of this message to the sender and delete the > message, all attachments, and any copies thereof from your system and > destroy any printout thereof. > > > > ____________________________________________________________________ > > __ > > The information in this email (including any attachments) is > confidential and may be legally privileged. Access to this e-mail by > anyone other than the intended addressee is unauthorized. If you are > not the intended recipient of this message, any review, disclosure, > copying, distribution, retention, or any action taken or omitted to be > taken in reliance on it (including any attachments) is prohibited and > may be unlawful. If you are not the intended recipient, please reply > to or forward a copy of this message to the sender and delete the > message, all attachments, and any copies thereof from your system and > destroy any printout thereof. > > > > -------------------------------------------------------------------- > > - > > To unsubscribe, e-mail: [EMAIL PROTECTED] > > For additional commands, e-mail: [EMAIL PROTECTED] > > > > > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] > > -- -- Lee Meador Sent from gmail. My real email address is [EMAIL PROTECTED] *********************************************************************************** The information in this email (including any attachments) is confidential and may be legally privileged. Access to this e-mail by anyone other than the intended addressee is unauthorized. If you are not the intended recipient of this message, any review, disclosure, copying, distribution, retention, or any action taken or omitted to be taken in reliance on it (including any attachments) is prohibited and may be unlawful. If you are not the intended recipient, please reply to or forward a copy of this message to the sender and delete the message, all attachments, and any copies thereof from your system and destroy any printout thereof. ______________________________________________________________________ The information in this email (including any attachments) is confidential and may be legally privileged. Access to this e-mail by anyone other than the intended addressee is unauthorized. If you are not the intended recipient of this message, any review, disclosure, copying, distribution, retention, or any action taken or omitted to be taken in reliance on it (including any attachments) is prohibited and may be unlawful. If you are not the intended recipient, please reply to or forward a copy of this message to the sender and delete the message, all attachments, and any copies thereof from your system and destroy any printout thereof. --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]