请教:ejb打包的中的额外jar包位置和设置

05-11-10 caigao
我有一个工程,用ejb3实现,现在我的工程中有以下文件:

project.par
project.ejb3
projectmanager.war
projectsetup.wear
projectweb.war

另外我还要用到公共类库:
commons-fileupload.jar
xml-dom3.jar
foobar.jar

因为我的三个war和ejb3都有可能用到这些公共组件中的某一个或者多个,因此我不想把它们分别放到war的lib目录下去,此时我将这三个公共类库和五个工程文件打包成一个ear文件,请问,我应该如何设置才能让我的程序找到这些公共类库?

查找了一下网上的讨论,banq说要在jar文件的.MTF中设置Class-Path,可是我这里没有jar文件啊?是ear文件中的META-INF/MANIFEST.MF文件吗?我试过了,好像不行.

我以前的作法是将公共类库打包成一个sar文件,然后在和工程程序一块放在ear中同时在ear/META-INF/application.xml中指定:
<module><java>file.sar</java></module>
可是这次却不灵了,请教各位,我应该如何设置?

谢谢.

caigao
2005-11-10 17:50
我有一个工程,用ejb3实现,现在我的工程中有以下文件:

project.par
project.ejb3
projectmanager.war
projectsetup.wear
projectweb.war

另外我还要用到公共类库:
commons-fileupload.jar
xml-dom3.jar
foobar.jar

因为我的三个war和ejb3都有可能用到这些公共组件中的某一个或者多个,因此我不想把它们分别放到war的lib目录下去,此时我将这三个公共类库和五个工程文件打包成一个ear文件,请问,我应该如何设置才能让我的程序找到这些公共类库?

查找了一下网上的讨论,banq说要在jar文件的.MTF中设置Class-Path,可是我这里没有jar文件啊?是ear文件中的META-INF/MANIFEST.MF文件吗?我试过了,好像不行.

我以前的作法是将公共类库打包成一个sar文件,然后在和工程程序一块放在ear中同时在ear/META-INF/application.xml中指定:

<module>
  <java>file.sar</java>
</module>
<p class="indent">


可是这次却不灵了,请教各位,我应该如何设置?

谢谢.


我还偿试过这样写,还是不行:

ear/META-INF/application.xml

    <module>
        <java>common-fileupload.jar</java>
    </module>
    <module>
        <java>xml-dom3.jar</java>
    </module>
    <module>
        <ejb>toy.par</ejb>
    </module>
    <module>
        <ejb>toy.ejb3</ejb>
    </module>
    <module>
        <web>
            <web-uri>toy.war</web-uri>
            <context-root>toy</context-root>
        </web>
    </module>
    ......
<p class="indent">

caigao
2005-11-11 12:32
求救!!!!!banq,烦你帮忙........

试了多种办法,现在只有一种解决方法:

把三个jar 放在war/WEB-INF/lib下面

哭啊.........................

caigao
2005-11-11 17:15
不是吧,没有人知道解决办法?

不是吧,没有人知道解决办法?

不是吧,没有人知道解决办法?

不是吧,没有人知道解决办法?

不是吧,没有人知道解决办法?

不是吧,没有人知道解决办法?

不是吧,没有人知道解决办法?

不是吧,没有人知道解决办法?

不是吧,没有人知道解决办法?

不是吧,没有人知道解决办法?

不是吧,没有人知道解决办法?

不是吧,没有人知道解决办法?

caigao
2005-11-14 09:34
不知道是我没有描述清楚还是没有人知道怎么做?
怎么没有人理睬我?


不知道是我没有描述清楚还是没有人知道怎么做?
怎么没有人理睬我?


不知道是我没有描述清楚还是没有人知道怎么做?
怎么没有人理睬我?

caigao
2005-11-14 09:43
再仔细修改一下,希望有高手帮助我.
谢谢

我有一个工程,用ejb3实现,现在我的工程中有以下文件:

project.par
project.ejb3
projectmanager.war
projectsetup.war
projectweb.war

另外我还要用到公共类库:
commons-fileupload.jar
xml-dom3.jar
foobar.jar
pubconstants.jar


因为我的三个war和ejb3都有可能用到这些公共组件中的某一个或者多个,因此我不想把它们分别放到war的lib目录下去,此时我将这四个公共组件和五个工程文件打包成一个ear文件,请问,我应该如何设置,放在何处才能让我的三个web程序(我的par,ejb3没有用到这些公共组件)找到这些公共组件?

查找了一下网上的讨论,banq说要在jar文件的.MTF中设置Class-Path,可是我这里没有jar文件啊?是war/META-INF/MANIFEST.MF吗?我试了一下好像不行啊?是不是我放的位置不对呢?jar应该放在哪里呢?(我是将所有文件平行放在ear的根目录下,Class-Path: comm.jar xm.jar foo.jar pub.jar)是ear文件中的META-INF/MANIFEST.MF文件吗?我试过了,好像不行.


我以前的作法是将公共类库打包成一个sar文件,然后在和工程程序一块平行放在ear中的根目录下,同时在ear/META-INF/application.xml中指定:

<module>
  <java>file.sar</java>
</module>
<module>
  //other modules
</module>
<p class="indent">


可是这次却不灵了,请教各位,我应该如何设置?

谢谢.


我还偿试将ear/META-INF/application.xml这样写,还是不行:

    <module>
        <java>common-fileupload.jar</java>
    </module>
    <module>
        <java>xml-dom3.jar</java>
    </module>
    <module>
        <ejb>toy.par</ejb>
    </module>
    <module>
        <ejb>toy.ejb3</ejb>
    </module>
    <module>
        <web>
            <web-uri>toy.war</web-uri>
            <context-root>toy</context-root>
        </web>
    </module>
    ......
<p class="indent">


希望各路高手帮忙
谢谢

caigao
2005-11-15 16:04
请高手帮忙,谢谢

banq
2005-11-15 17:22
这三个公共类库是.jar形式啊,可以放在classpath看看,如果是JBoss,放在server/lib目录下看看。

或者打包在ear中,和war 以及EJB的jar 并列在一起,一般也可以。

Kyle_Yin
2005-11-16 13:49
类库问题,有套路可循:

1。最简单粗暴的办法,是放在CLASSPATH里。这个办法能保证库里的类总能被找到,但是根据具体类库,可能会引起一系列的问题。比如 XERCES, XALAN 之类的,几乎系统各层都用。乱放这些库会引起功能紊乱,内存泄漏等等一系列问题。

2。用 J2EE 1.4 规范 8.2 小节制定的方法:“installed optional package”。类似上面的方法。

3。用 Jar 文件规范制定的方法,J2EE1.4 中所谓“bundled optional package”。即,在用户JAR一方的 meta-inf/manifest.mf 的 header 部分中指定: Class-path: jar1.jar jar2.jar jar3.jar

4。分别部署到每一个 JAR 和 WAR web-inf/lib里。

上面的方法都是符合规范的,在任何服务器上都是可行的。

另外针对具体部署平台,可以利用平台支持的特性,使用下面这些针对平台,但不负荷规范的方法:

5。在 WEBLOGIC 上,只需要把 JAR 打包在 EAR 的 app-inf/lib 即可。这是WEBLOGIC的一个著名功能,以至于很多J2EE开发人员以为这是一个J2EE规范作法。
6。在 WEBLOGIC 上,可以使用“LIBRARY MODULE”。这个WEBLOGIC的特有功能支持在不同EAR之间共享其他 EAR, JAR 或者 WAR。需要WEBLOGIC9以上。
7。利用服务器 CLASSLOADER 结构。在 WEBSPHERE 和 WEBLOGIC 上,EJB的 CLASSLOADER 都是 WAR CLASSLOADER 的 “父类加载器”。所以,只要把类库部署在EJB中,WAR自然会找到这个类库。

caigao
2005-11-16 16:50
多谢Kyle_Yin和banq.
1.这个方法肯定不行,因为我的类库里面正好用到了xalan,另外还不知道commons-fileupload.jar与系统的类库有没有冲突.
2.不考虑
4.因为我的需求是三个war程序都要用到一个或多个jar类库,我不想把这些类库重复地放在这三个war的WEB-INF/lib目录下,所以我想把它们独立出来,所以这个方法也不考虑.

3.我们要讨论的就是这个方法,我的问题是这些jar1,jar2,jar3放在哪里呢?
有两个可能:
1)和ejb-jar平行放置,即project.ejb3,project.par,projectsetup.war,projectweb.war,jar1.jar,jar2.jar,jar3.jar...平行地打包在project.ear文件中,同时在.war文件的META-INF/MANIFEST.MF中指定各自所需要的Class-Path: jar1.jar jar3.jar foobar.jar
可是我这样做了,行不通,不知道为什么?????
2)war应用程序中用到的类库(servlet,action...)打包成jar放在/WEB-INF/lib中,在这个打包的jar中进行Class-Path指定,那么此时的Class-Path应该怎么设定呢?jar1.jar又应该放在哪里呢?
请指教.
为什么第一种方法不行呢?
什么地方不妥?


> 类库问题,有套路可循:
>
> 1。最简单粗暴的办法,是放在CLASSPATH里。这个办法能保证
> 问题。比如 XERCES, XALAN
> 之类的,几乎系统各层都用。乱放这些库会引起功能紊乱,内
> 2。用 J2EE 1.4 规范 8.2 小节制定的方法:“installed
> optional package”。类似上面的方法。
>
> 3。用 Jar 文件规范制定的方法,J2EE1.4 中所谓“bundled
> optional package”。即,在用户JAR一方的
> meta-inf/manifest.mf 的 header 部分中指定:
> Class-path: jar1.jar jar2.jar jar3.jar
>
> 4。分别部署到每一个 JAR 和 WAR web-inf/lib里。
>
> 上面的方法都是符合规范的,在任何服务器上都是可行的。

caigao
2005-11-18 11:45
uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuup

kevinzhou
2005-11-19 08:41
这个问题我也想知道答案
像log4j这种类库,放到weblogic的classpath里面固然可以,但如果能和ear打包到一起就更方便了。

banq
2005-11-19 12:44
出现这样问题和容器classLoader策略有关,没有不变的解决办法,只有Yin总结那几种逐个试验,成功即可。

caigao
2005-11-19 14:28
找到解决办法了,虽然不是最理想的:

本来我有三个web WAR应用程序的,
一个客户端project.war
一个管理端projectmanager.war
一个初始化应用程序projectsetup.war

现在把它们合并成一个web应用程序!

在project.war里面分别给setup和management建立一个子目录,
本来的想法是setup完成以后这个应用程序就可以不用布署了,
结果布署开发过程中发现在测试很多次,
现在只好分两次打包,
一次有setup目录,一次没有setup目录,
(setup程序负责将文本格式的基础数据导入数据库,有27万条数据)
安装完成以后就可以布署没有setup那个应用程序,
这样的话所有第三方lib就都可以放在WEB-INF/lib下面了.

哎,笨办法啊.

正在准备研究如何将最后的打包工作(ear)放到服务器上,在服务器上创建一个脚本,上传的时候只传自己开发的程序就可以了.

没办法,网络速度慢啊.



猜你喜欢