我是我公司的新配置经理,我正在启动一个项目来清理我们的大部分构建过程。
我们在一个 Subversion 项目中存放了大量的罐子。有些人将这些 jar 复制到他们的项目中。其他人将他们项目中的 SVN:External 放到此目录中。其他人在这些罐子中复制的方式很复杂。这些是我们假设使用的唯一罐子。
我要搬到常春藤,也许还要搬到 Maven。我已经设置了一个 Maven 存储库,并确定了这些 jar 的 GroupId、ArtifactId 和 Version,并记录了如何通过 Ivy 和 Maven 配置访问您需要的那些。
我想浏览所有项目的源文件,找到所有导入语句,并将这些导入与这些 jar 包含的所有类进行比较。
我想找到给定的一组源直接调用的所有罐子。例如,如果一个 jar 包含:
import org.apache.commons.beanutils.*
我知道它需要 commons-beanutils.jar(1.6 版)。我也知道它需要 commons-logging.jar,但我会让 Maven 和 Ivy 处理这个问题。我只想告诉开发人员当他们创建他们的pom.xml
or时ivy.xml
,他们需要包含common-beanutils#common-beansutil#1.6
在他们的pom.xml
orivy.xml
文件中。
我知道这不会是一个完整的列表。我知道运行时需要 jar,但不能编译。我也知道有些类可以使用多个 jar。我现在开发人员也可以这样做:
import org.apache.commons.*;
这将与几十个罐子相匹配,什么也不告诉我。(也许有一种方法可以确定 Java 源文件中实际使用了哪些类)。
我可以编写一个 Python 或 Perl 脚本来完成这项工作,但我希望已经有一些东西可以为我节省几个小时的工作。我知道 JBoss 的 TattleTale,但文档似乎说它只适用于 jar 并显示 jar 之间的依赖关系等。我对此并不感兴趣。我只想知道我们的源调用了哪些 jar,并让 Ivy 和 Maven 处理更深层次的依赖关系。
有没有这样的工具?
附录
只是为了更具体。这是一个老项目。事实上,有50个左右的项目。我们知道一个特定的项目需要 20 个 jars 才能运行,而 TattleTail 等工具可以通过并向您展示整个数据分析。
但是,让我们从开发人员的角度来看它。我有一个问题,我找到了一个可以解决我的问题的开源项目。我阅读了文档,编写了代码并导入了我需要的类。我知道那个包含类的开源项目的 jar,这就是我所知道的。
我要做的是回到最初开发者的心态:我在这个项目中使用了这些类,我需要这5个jar。这 5 个 jar 可能需要另外 15 个才能运行,这是 Ivy/Maven 现在将处理的事情。我们知道程序需要的 20 个罐子。我只想要开发人员最初在他们的代码中提到的 5 个。
这是为了帮助开发人员编写他们的pom.xml
or ivy.xml
. 我不希望他们将所有 20 个罐子都放在那个pom.xml
或那个ivy.xml
文件中——只是他们需要的五个。
This is just a starting point. They might have imported com.foo.bar.bar.foo
and that class is in foo-all.jar
, foo-client.jar
, and bar-talk.com
. The developers will have to decide which one of these their project needs.
This is a massive paradigm shift in our programming, but we are losing track of jars and versions, and making sure all of these projects can talk to each other. Using Ivy/Maven will greatly simplify this mess.