我是一名 CM,负责我们的持续构建过程,并帮助开发人员正确定义和使用构建。我尝试以这样一种方式进行设置,即开发人员只需从源代码控制系统下载模块,然后输入ant
ormaven
并让一切正常工作。
在 Ant 项目中,我使用ivy
或拥有一个lib
包含所需第三方 jar 文件的目录。这有助于我清楚地定义所有依赖项,并使开发人员可以轻松地在他们的系统上构建模块。是的,对正确的 JDK 版本有一些依赖性,对正确的 Ant 版本也有一些依赖性,但即使这些也有点灵活。除了 Ecipse 和 Jenkins/Hudson 之外,您还可以定义要使用的确切 JDK 和 Ant 版本。
问题是这个项目依赖于 Weblogic 10.3(又名 11g)。在 Weblogic 10 之前,您几乎可以只使用 weblogic.jar 文件和一两个其他 jars。从 Weblogic 10 开始,jar 现在是“模块化的”。
当我进行构建时,我仍然只是简单地包含weblogic.jar
在我的类路径中。但是,weblogic.jar
在其MANIFEST.MF
文件中包含对..\..\..\modules\features
目录的引用(实际上是包含 Weblogic 10.3 的父目录!)。这里是不包含类路径的 jar,但它们本身嵌入了MANIFEST.MF
一个指向其他 jar 的 Classpath。这些反过来可以引用其他罐子。
我想我有以下选择之一:
- 在我的源存储库中为每个模块包含整个 10,900 个文件、700Mb Weblogic。
- 不知何故,使用 Maven 或 Ivy 作为单个 tarball 下载 Weblogic。解压文件,然后进行我的构建。
- 告诉开发人员他们必须下载 Weblogic 10.3,然后修改构建过程以指向他们安装 Weblogic 10.3 的位置。
这些选项现在都没有真正吸引我。
更新
正如其他人指出的那样,我可以尝试找到各种 jar,而我正是使用 Weblogic 9.x 和更早版本做到的。例如,一个简单的 shell 脚本:
find $WEBLOGIC_HOME -name "*.jar" | while read jar
do
echo "JAR NAME = jar"
jar tvf $jar
done | less
将在我的终端上显示所有 Weblogic JAR 的内容。如果我在构建中发现javax.servlet.ServletException
该类丢失,我可以搜索javax\servlet\ServletException.class
,然后继续搜索JAR NAME =
并找到 jar 的名称。
但是,在 Weblogic 10 中,我发现我依赖于javax.servlet.ServletException
,并将其追溯到C:\bea\modules\javax.servlet_1.0.0.0.0.jar
甚至不在我的$WEBLOGIC_HOME
目录中的那个。这是因为C:\bea\wlserver_10.3\server\lib\weblogic.jar
包含指向..\..\..\modules\features\somejar.jar
. 并且somejar.jar
不包含任何类。相反,它在其类路径中包含对另一个 jar 的引用,然后引用javax.servlet_1.0.0.0.0.jar
.
所以,我现在必须再添加四个 jar,其中一个不包含任何类,如果我想模拟 Weblogic 的结构,我的lib
目录中必须有以下文件:
weblogic.lib\wlserver_10.3\server\lib\weblogic.jar
weblogic.lib\modules\features\somejar.jar
weblogic.lib\modules\someOtherJar.jar
weblogic.lib\modules\javax.servlet_1.0.0.0.0.jar
好的,只花了大约 2 个小时就解决了。一个依赖问题下降了,还有 43 个问题要解决。
如您所见,这可能需要几天甚至几周的时间才能完成,并且最终会在我的……呃……最小的Weblogic 10 模块中产生数十个 jar。最后,这个最小的模块可能不会那么小。
有谁知道可能有一些文档可以让我快速确定这些依赖项存在的位置,或者一种构建依赖项树的方法,这样当我需要类路径 com.bea.weblogic.foo.bar.barfoo 时,我可以快速查看我需要这 7 或 8 个罐子吗?