views:

2130

answers:

3

Hi,

A library that my java application uses needs looks for a file (log4j.xml) in the class path. I use netbeans to manage my project, but I can't find a way to include the lib/ folder.

Netbeans automatically creates a MANIFEST.MF file inside the application jar and also creates a folder called lib/ which includes all dependencies. This manifest specifies a Class-Path attribute that overrides any -cp argument provided on the command line. I can select an arbitrary folder in netbeans' library panel, but it creates a sub folder in the manifest's classpath. I'd like all dependencies and the log4j.xml file inside the lib/ folder.

Hopefully it's possible to do this in the IDE. I include a snippet of the auto-generated build-impl.xml file.

<target depends="init,compile,-pre-pre-jar,-pre-jar" if="manifest.available+main.class+mkdist.available" name="-do-jar-with-libraries">
    <property location="${build.classes.dir}" name="build.classes.dir.resolved"/>
    <pathconvert property="run.classpath.without.build.classes.dir">
        <path path="${run.classpath}"/>
        <map from="${build.classes.dir.resolved}" to=""/>
    </pathconvert>
    <pathconvert pathsep=" " property="jar.classpath">
        <path path="${run.classpath.without.build.classes.dir}"/>
        <chainedmapper>
            <flattenmapper/>
            <globmapper from="*" to="lib/*"/>
        </chainedmapper>
    </pathconvert>
    <taskdef classname="org.netbeans.modules.java.j2seproject.copylibstask.CopyLibs" classpath="${libs.CopyLibs.classpath}" name="copylibs"/>
    <copylibs compress="${jar.compress}" jarfile="${dist.jar}" manifest="${manifest.file}" runtimeclasspath="${run.classpath.without.build.classes.dir}">
        <fileset dir="${build.classes.dir}"/>
        <manifest>
            <attribute name="Main-Class" value="${main.class}"/>
            <attribute name="Class-Path" value="${jar.classpath}"/>
        </manifest>
    </copylibs>
    <echo>To run this application from the command line without Ant, try:</echo>
    <property location="${dist.jar}" name="dist.jar.resolved"/>
    <echo>java -jar "${dist.jar.resolved}"</echo>
</target>

Thanks.

A: 

It seems that your problem is the "globmapper" that stores your log4j.xml file in /lib - you'd want it on the "/" or the jar.

Guss
If I remove the globmapper instruction, then the Class-Path is pointing to the wrong folder (not lib/). Same thing if I just modify it.The jar files are correctly bundled. I want to add the lib/ folder to the Class-Path.
FB
Then just change the `<path>` builder to point at lib/ directly, so instead of `${run.classpath.without.build.classes.dir}` use `${run.classpath.without.build.classes.dir}/lib`
Guss
Changing the <path> adds a lib/lib in the classpath which is not correct either. I want everything (jar and xml) in the lib/.Also, any modification to the build-impl.xml will be lost next time Netbeans recreates it. (This seems random though)
FB
Then it means netbeans tries to be intelligent about its build process - which is always a source for problems when a software tries to be more intelligent then the developer ;-) . I'll play with Netbeans a bit and try to come up with a solution.
Guss
A: 

I found a way to acheive this modifying the build-impl.xml.

I changed:

<attribute name="Class-Path" value="${jar.classpath}"/>

to:

<attribute name="Class-Path" value="${jar.classpath} /lib"/>

The problem is that netbeans will overwrite it since this file is automatically generated.

FB
Perhaps you could build a custom ANT script outside of Netbeans so that it doesn't get overwritten.
ssakl
I might it nothing else works. I have no knowledge of Ant and don't have much time to pass on learning Ant. I thought my question would be a no brainer. :(
FB
A: 

Netbeans is far too "intelligent". It's in the "self-healing" class with Windblows. Perhaps these things can all be grouped together and called software cancer.

Hugh