I am creating a multi-module project using Play 2.3 and Java 8. The root application, and each module has a Global object. But as we know, Play uses only one global object from the root application.
Simplified folder structure:
/root
/app
Global.java
/conf
application.conf
/subprojects
/user
/app
UserGlobal.java
/admin
/app
AdminGlobal.java
All global classes placed in an unnamed package.
I use this method to merge global objects from subprojects:
1) Declared configuration variable in the root application application.conf
subprojects.with.globals="subprojectName1, subprojectName2, subprojectName3, ..."
2) Added a private field and private method to the root directory of Global.java
private List<GlobalSettings> subprojectGlobals = new ArrayList<>();
private void LoadSubprojectGlobals(Application app)
throws ClassNotFoundException, IllegalAccessException, InstantiationException
{
String subprojectNames =
app.configuration().getString("subprojects.with.globals");
if (!subprojectNames.isEmpty())
{
Class subprojectGlobalClass = null;
for (String subprojectName : subprojectNames.split(","))
{
subprojectGlobalClass = Class.forName(
WordUtils.capitalize(subprojectName.trim().toLowerCase()) +
"Global"
);
subprojectGlobals.add(
(GlobalSettings)subprojectGlobalClass.newInstance()
);
}
}
}
3) I placed this code in the onStart event handler in the Global.java root folder
@Override
public void onStart(Application app)
{
try
{
LoadSubprojectGlobals(app);
}
catch(Exception e)
{
new RuntimeException(e);
}
for(GlobalSettings subprojectGlobal: subprojectGlobals)
{
subprojectGlobal.onStart(app);
}
}
, , subprojects.with.globals application.conf. , Global.java.
, java- root onStart. ? root build.sbt Application?
UPDATE
, @Mon Calamari.
1) subprojects.with.globals root application.conf.
2) :
/subprojects
/user
/app
/globals
UserGlobal.java
/admin
/app
/globals
AdminGlobal.java
3) subproject conf,
application.global= globals.UserGlobal
4) LoadSubprojectGlobals():
private void LoadSubprojectGlobals(Application app)
throws ClassNotFoundException, IllegalAccessException, InstantiationException
{
Reflections reflections = new Reflections("globals");
Set<Class<? extends GlobalSettings>> subprojectGlobalClasses =
reflections.getSubTypesOf(GlobalSettings.class);
for(Class subprojectGlobalClass : subprojectGlobalClasses)
{
subprojectGlobals.add(
(GlobalSettings)subprojectGlobalClass.newInstance()
);
}
}
, , , .
.