Executable JAR & Ant

2019-08-13 03:34发布

I'm writing an Ant build.xml file for an executable JAR for the first time, and am stumped as to what I need to include in the JAR.

The project can be thought of being composed of the following:

  1. The source code
  2. A handful of dependency JARs
  3. A Spring configuration file (XML) for IoC via ClassPathXmlApplicationContext

Here's my question: since this is an executable JAR, should I be JARring up all the dependency JARs as well, or should I keep them separate? I suspect I need to include them in the JAR, and if this is true, what would best practices dictate for organizing my JAR?

Here's my first attempt:

MyExecutableJARProgram.jar/
    META-INF/
        ...
    com/
    lib/
    config/

Where com/ is my top-level package, lib/ is a directory housing all of these dependencies, and config/ holds the required XML files.

(1) Any thoughts?

Also, as a side question, since the JAR file will have a different directory structure than my Eclipse project, I need someway of setting up the classpath for my JAR (so it knows to look in, say, lib/ for its dependencies), as well as specifying where to look for my Spring XML file.

(2) How do I configure this in the JAR - the manifest file? There must be some way to configure the manifest (or whatever is the answer to this question) file through Ant so I don't need to manually edit the JAR every time I build.

Thanks for any input!

1条回答
虎瘦雄心在
2楼-- · 2019-08-13 03:57

Unless you are willing to write a custom classloader, the manifest classpath does not support nested JARs. Instead, a typical approach is to place any third party binaries and your JARs in the same (or well known) directory, and refer to one another using manifest classpaths. Remember that that entries in the manifest classpath are relative to the main jar.

So for some non-trivial project, your distribution layout may look like:

[apphome]
  +-- bin
        +-- command1.sh / .bat  (to supply -Xmx etc)
        +-- command2.sh / .bat
            ...
  +-- lib
        +-- module1.jar
        +-- module2.jar
            ...
        +-- command1.jar (manifest cp contains modules, 3rd party, main-class)
        +-- command2.jar
            ...
  +-- deps
        +-- 3rdparty1.jar
        +-- 3rdparty2.jar
             ...
查看更多
登录 后发表回答