Hi Dennis,

I think you are almost there to get this working. How are you running
this Java application? Are you using Ant's java task? What does it look
like? Just like you did with javac, the java task will need to know what
classpath to use while running the application. As long as you setup
your classpath to contain all these necessary jar files, you should no
longer see those exceptions.

-Jaikiran

On 18/02/19 8:15 PM, Dennis Putnam wrote:
> Hi Matt and Jan,
>
> Thanks to both of you as I am closer but I think I am still missing a
> piece. I am now getting a successful build but the resulting jar is
> not finding the classes in the external jars. When I run the jar I get
> this exception:
>
>     Exception in thread "main" java.lang.NoClassDefFoundError:
>     org/apache/http/HttpEntity
>             at KCBSEvents.Registration.isRegistered(Unknown Source)
>             at KCBSEvents.KCBSEvents.main(Unknown Source)
>     Caused by: java.lang.ClassNotFoundException:
>     org.apache.http.HttpEntity
>             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)
>             ... 2 more
>
>
> That happens to be the first attempt to execute one of the external
> jar classes which is a Maven dependency. Here is my new build.xml:
>
>     <?xml version="1.0" encoding="UTF-8"?>
>     <project name="KCBSEvents" default="jar" basedir=".">
>             <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="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>**
>     **        </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>
>                             *<!-- zipfilesets removed -->*
>                     </jar>
>             </target>
>     </project>
>
> Does this come back to my question about needing the zipfileset
> elements for the Maven jars? I don't know how the pom.xml for Maven
> gets pulled into this either.
>
> On 2/17/2019 12:45 PM, Matt Bertolini wrote:
>> Hi Dennis,
>>
>> I think you might be mixing up Eclipse concepts and Ant concepts and that
>> might be causing some extra confusion. Based on your original email, the
>> compiler is having issues finding your third-party dependencies. I believe
>> Jaikiran is correct in saying that the <javac> task needs to be given some
>> sort of classpath. The .classpath file is an Eclipse concept and unless
>> there is some sort of Eclipse/Ant plugin I am not aware of, the .classpath
>> file will have no effect on Ant’s, <javac> task. Also, I don’t believe the
>> <javac> task has a default value for the classpath attribute. If no
>> classpath or classpathref is specified then the compiler is not passed any
>> classpath information.
>>
>> I would start by locating the folder where your third-party dependencies
>> are and create a <path> element containing them like this:
>>
>> <path id="compile-classpath">
>>     <fileset dir="/the/path/to/your/third/party/jars"/>
>> </path>
>>
>> Once you have a path defined you can pass the classpath to the <javac> task
>> using a refid like this:
>>
>> <javac srcdir="src" destdir="bin" includeantruntime="false"
>> classpathref="compile-classpath"/>
>>
>> Try that and see how it goes.
>>
>> Matt Bertolini
>>
>>
>

Reply via email to