A little sample: * src\java\org\apache\ant\Application.java Sample application which uses Log4J2 as external dependency * src\resources\log4j2.xml Configuration file for Log4J2 * build.xml Ant buildscript
Run the script with "ant". Then start the application with "java -jar lib\Application.jar". The app will prompt all given arguments via Log4J2-Logger. Have a look at the "build" target and the resulting manifest inside the jar. Jan Application.java ----8-<------8-<------8-<------8-<------8-<-- package org.apache.ant; import java.util.stream.Stream; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; public class Application { public static void main(String[] args) { Logger logger = LogManager.getLogger(Application.class); if (args.length == 0) { logger.info("Application started without any argument."); } else { logger.info("Application started with %d arguments:%n", args.length); Stream.of(args) .map( s -> "- '"+s+"'" ) .forEach(logger::info); } } } ----8-<------8-<------8-<------8-<------8-<-- log4j2.xml ----8-<------8-<------8-<------8-<------8-<-- <?xml version="1.0" encoding="UTF-8"?> <Configuration status="WARN"> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> </Console> </Appenders> <Loggers> <Root level="debug"> <AppenderRef ref="Console"/> </Root> </Loggers> </Configuration> ----8-<------8-<------8-<------8-<------8-<-- build.xml ----8-<------8-<------8-<------8-<------8-<-- <project name="Application" default="build"> <property name="build.dir" value="build"/> <property name="src.dir" value="src"/> <property name="lib.dir" value="lib"/> <property name="main.class" value="org.apache.ant.Application"/> <property name="classes.dir" value="${build.dir}/classes"/> <property name="java.src" value="${src.dir}/java"/> <property name="resources.src" value="${src.dir}/resources"/> <target name="clean"> <delete dir="${build.dir}"/> </target> <target name="download-dependencies"> <mkdir dir="${lib.dir}"/> <!-- Performance improvement: don't download multiple times --> <!-- TODO: available+get as macro --> <available property="log4j-core.present" file="${lib.dir}/log4j-core-2.11.2.jar"/> <get xmlns:unless="ant:unless" unless:set="log4j-core.present" src="https://search.maven.org/remotecontent?filepath=org/apache/logging/log4j/log4j-core/2.11.2/log4j-core-2.11.2.jar" dest="${lib.dir}/log4j-core-2.11.2.jar" /> <available property="log4j-api.present" file="${lib.dir}/log4j-api-2.11.2.jar"/> <get xmlns:unless="ant:unless" unless:set="log4j-api.present" src="https://search.maven.org/remotecontent?filepath=org/apache/logging/log4j/log4j-api/2.11.2/log4j-api-2.11.2.jar" dest="${lib.dir}/log4j-api-2.11.2.jar" /> </target> <target name="compile" depends="download-dependencies"> <mkdir dir="${classes.dir}"/> <javac srcdir="${src.dir}" destdir="${classes.dir}" includeantruntime="false"> <classpath id="cp.runtime"> <fileset dir="${lib.dir}" includes="**/*.jar"/> </classpath> </javac> </target> <target name="build" depends="compile"> <manifestclasspath property="jar.classpath" jarfile="${build.dir}/${ant.project.name}.jar"> <classpath refid="cp.runtime"/> </manifestclasspath> <jar destfile="${build.dir}/${ant.project.name}.jar"> <fileset dir="${classes.dir}"/> <fileset dir="${resources.src}"/> <manifest> <attribute name="Main-Class" value="${main.class}"/> <attribute name="Class-Path" value="${jar.classpath}"/> </manifest> </jar> </target> </project> ----8-<------8-<------8-<------8-<------8-<-- > -----Ursprüngliche Nachricht----- > Von: Jan Matèrne (jhm) [mailto:apa...@materne.de] > Gesendet: Montag, 25. Februar 2019 14:08 > An: 'Ant Users List' > Betreff: AW: AW: Javac Run By Ant Script is Unable to Find External > Jars > > Could you post the content of the manifest file and your directory > structure? > > I suppose that the paths are not correct … > > > > Jan > > > > Von: Dennis Putnam [mailto:d...@bellsouth.net] > Gesendet: Montag, 25. Februar 2019 13:09 > An: user@ant.apache.org > Betreff: Re: AW: Javac Run By Ant Script is Unable to Find External > Jars > > > > My apologies again but I have not made any progress on this problem. Is > there perhaps a better forum I should be using at this point? I did > make one discovery. It appears that although the application works in > Eclipse when I try to export it to a runnable jar using the Eclipse > wizard, the resulting jar fails as well. It seems to me that the > problem is not ant specific but something in the app build per se. > > On 2/21/2019 10:18 AM, Dennis Putnam wrote: > > I found an article on adding Maven dependencies to my ant script. While > I'm getting a successful build but the same exception when I run the > jar, I hope this is getting me closer. At least the pom.xml is in the > build. I am wondering if the added fileset is right and working. Here > is my latest: > > <?xml version="1.0" encoding="UTF-8"?> > <project name="KCBSEvents" default="jar" basedir="." > xmlns:artifact="antlib:org.apache.maven.artifact.ant"> > <property name="build.properties" value="build.properties"/> > <property name="resources" value="resource" /> > <property name="jardir" value="KCBSEvents" /> > <property name="KCBSDir" value="src/KCBSEvents" /> > <property name="member.number" value="000000" /> > <property name="member.name" value="" /> > <property name="jarpath" value="/${user.home}/.m2/repository" > /> > <path id="maven-ant-tasks.classpath" path="/lib/jvm- > exports/maven-ant-tasks-2.1.3.jar" /> > <typedef resource="org/apache/maven/artifact/ant/antlib.xml" > uri="antlib:org.apache.maven.artifact.ant" classpathref="maven-ant- > tasks.classpath" /> > <artifact:pom id="pomfile" file="pom.xml" /> > <artifact:dependencies filesetId="mvn-dependencies" > pomRefId="pomfile" /> > <path id="compile-jars"> > <multirootfileset basedirs="${jarpath}/commons- > io/2.5,${jarpath}/httpcomponents-client,${jarpath}/commons- > logging/1.2,${jarpath}/commons-codec/1.10,/lib/java-ext/json-simple- > 1.1.1"> > <include name="commons-io-2.5.jar" /> > <include name="httpclient-4.5.6.jar" /> > <include name="httpcore-4.4.10.jar" /> > <include name="commons-logging-1.2.jar" /> > <include name="commons-codec-1.10.jar" /> > <include name="json-simple-1.1.1.jar" /> > </multirootfileset> > <fileset refid="mvn-dependencies" /> > </path> > <target name="checkOS"> > <condition property="isWindows"> > <os family="windows" /> > </condition> > <condition property="isLinux"> > <os family="unix" /> > </condition> > </target> > <target name="if_windows" depends="checkOS" if="isWindows"> > <property name="jarfile" value="C:\temp\KCBSEvents.jar" > /> > <property name="antcontrib" value="H:\html\Applets\ant- > contrib" /> > </target> > <target name="if_linux" depends="checkOS" if="isLinux"> > <property name="jarfile" > value="/tmp/${member.number}/KCBSEvents.jar" /> > <property name="antcontrib" > value="/var/www/html/Applets/ant-contrib/ant-contrib-1.0b3.jar" /> > </target> > <target name="setclass" depends="if_linux,if_windows"> > <taskdef > resource="net/sf/antcontrib/antcontrib.properties"> > <classpath> > <pathelement location="${antcontrib}" > /> > </classpath> > </taskdef> > </target> > <target name="incserial" depends="setclass"> > <copy todir="bin/${jardir}/${resources}"> > <fileset dir="${KCBSDir}/${resources}"> > <include name="${build.properties}" /> > </fileset> > <filterchain> > <expandproperties /> > </filterchain> > </copy> > <if> <isset Property="build.number" /> <then> > <echo message="update build requested" /> > </then> <else> > <echo message="new build requested" /> > <buildnumber /> > </else> </if> > <propertyfile > file="bin/${jardir}/${resources}/${build.properties}"> > <entry key="serialnumber" > value="${build.number}" /> > <entry key="membernumber" > value="${member.number}" /> > <entry key="name" value="${member.name}" /> > </propertyfile> > <echo message="serial number: ${build.number}" /> > </target> > <target name="jar" description="Compile serialized jar" > depends="incserial,if_windows,if_linux"> > <echo message="Using destination file ${jarfile}" /> > <javac srcdir="src" destdir="bin" > includeantruntime="false" classpathref="compile-jars" /> > <jar destfile="${jarfile}" basedir="bin" > filesetmanifest="mergewithoutmain"> > <manifest> > <attribute name="Manifest-Version" > value="1.0"/> > <attribute name="Created-By" value="ant > 1.9.2 on CentOS 7" /> > <attribute name="Main-Class" > value="KCBSEvents.KCBSEvents" /> > </manifest> > </jar> > </target> > </project> > > > On 2/20/2019 3:22 PM, Jan Matèrne (jhm) wrote: > > If you have created your JAR the first step is done. > > Starting the JAR could be done in several ways. Common is that you have > to have all external classes on the runtime classpath: > > > > 1. Hard coded start script. > > Write a bash/bat-Script with the java command with all cp settings, > e.g. (bat) > > @echo off > > java -cp /build/myjar.jar;lib/one.jar;lib/two.jar;lib/three.jar > org.acme.Main %* > > > > 2. Wrapper script which collects all JARs in a dynamic way (see > ant.bat|ant.sh) > > > > 3. Use Ant + <java><classpath> for starting > > > > 4. Create a runnable JAR which references the external JARs (manifest: > main-class + classpath) > > > > 5. Create a shaded jar (uber jar, fat jar): include all classes from > external jars into your jar > > > > 6. Use a launcher which uses a dependency manager for getting the > classpath > > > > > > > > You don't have to replicate path definitions in your buildfile, you > could (and should) use references: > > <javac><classpath id="runtime.cp"><fileset dir="lib" > includes="**/*.jar"/>… > > <java><classpath refid="runtime.cp"/> > > > > > > You mave have a look at http://ant.apache.org/manual/tutorial- > HelloWorldWithAnt.html > > > > > > Jan > > > > > > > --------------------------------------------------------------------- To unsubscribe, e-mail: user-unsubscr...@ant.apache.org For additional commands, e-mail: user-h...@ant.apache.org