Hi Jan, I need to take a timeout. In my machinations I've created a new problem that seems unrelated to ant. I'm trying to resolve that via the Eclipse forum. I don't know if this new problem is masking the original one or if it is related. I'll have to get back to you when I know which.
On 2/25/2019 9:15 AM, Jan Matèrne (jhm) wrote: > 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 > >
signature.asc
Description: OpenPGP digital signature