我有两个Play 2.2.1应用程序,X和Y.这两个应用程序都在默认包中有一个Global对象,它扩展了GlobalSettings并覆盖了onStart。应用程序X在maven repo中发布,应用程序Y以X作为依赖项。在尝试运行应用程序Y时,我在onStart期间一直遇到奇怪的异常。应用程序X的onStart函数中的代码会抛出这些异常。我没有得到任何编译时错误或警告。
这是预期的吗?这是Play特定问题还是会在默认包中的名称发生冲突时发生这种情况?如何防止应用程序的GlobalSetting混合在一起?
我最初将公共代码放入了自己的项目中,这两个Play应用程序共享为依赖项。这很难维护,并且所有共享代码都属于app X,因此我进行了重组。
答案 0 :(得分:1)
您看到的错误源于您的类加载器中有多个Global
对象,以及未加载哪个对象。类加载器就像一个文件系统,在给定目录中只能有一个具有给定名称的文件。如果您的类路径上有两个库,它们在同一目录中定义了一个具有相同名称的文件,它们不会合并,而是一个覆盖另一个,哪一个使用取决于类加载器实现 - 在Play中我们特别不定义排序。
Global
对象必须仅由最终应用程序定义。任何旨在作为依赖项使用的项目都不能定义Global
对象。它应该定义Global
对象可以使用的某个行为。如果它想在启动时透明地插入行为,请考虑实现Plugin
接口,如下所示:
http://developer.vz.net/2012/03/16/writing-a-play-2-0-module/