java - Play 应用程序全局设置的混合

标签 java scala maven playframework playframework-2.0

我有两个 Play 2.2.1 应用程序 X 和 Y。这两个应用程序在默认包中都有一个 Global 对象,该对象扩展 GlobalSettings 并覆盖 onStart。应用程序 X 在 Maven 存储库中发布,应用程序 Y 将 X 作为依赖项。当尝试运行应用程序 Y 时,我在 onStart 期间不断收到奇怪的异常。这些异常是由应用程序 X 的 onStart 函数中的代码引发的。我没有收到任何编译时错误或警告。

这是预期的吗?这是 Play 特有的问题还是每次默认包中的名称发生冲突时都会发生这种情况?如何防止应用程序的 GlobalSettings 混合在一起?

我最初将通用代码放入自己的项目中,两个 Play 应用程序作为依赖项共享该项目。这维护起来很烦人,而且所有共享代码确实属于应用程序 X,所以我重新组织了。

最佳答案

您看到的错误可能是由于您的类加载器中有多个 Global 对象,而加载的对象是未定义的。类加载器就像一个文件系统,给定目录中只能有一个给定名称的文件。如果您的类路径上有两个库,它们在同一目录中定义了具有相同名称的文件,则它们不会合并,而是一个会覆盖另一个,并且使用哪个库取决于类加载器实现 - 在 Play 中,我们特别不这样做定义顺序。

Global 对象必须由最终应用程序定义。任何打算作为依赖项使用的项目都不得定义 Global 对象。它应该在可以被全局对象使用的地方定义行为。如果它想在启动时透明地插入行为,请考虑实现 Plugin 接口(interface),如下所示:

http://developer.vz.net/2012/03/16/writing-a-play-2-0-module/

关于java - Play 应用程序全局设置的混合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20753886/

相关文章:

java - Java Swing FocusListener的MVC实现

scala - 线程 "main"中的异常 java.lang.NoSuchMethodError : scala. Product.$init$(Lscala/Product;)

java - 以编程方式调用 scala 解释器

json - 哪个 JSON 序列化库适合以下情况?

maven - 对 Maven 发布强制进行身份验证

java - Springboot 可执行 JAR - 错误 : Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean

java - 从 jar 加载自定义类时出现 ClassCastException

java - 如何将打印流重定向到 JTextArea?

java - 是否可以根据 Java 中的 boolean 值在 for 循环中增加或减少变量?

java - Spring mvc。不区分大小写的获取参数映射