Вы можете разбить ваш код на слои, и нижние уровни будут вызывать верхние уровни, но никогда не наоборот. Например, в веб-приложении вы можете иметь слой представления, слой обслуживания и слой постоянства. Уровень представления вызывает уровень обслуживания, а уровень обслуживания вызывает уровень постоянства, но уровень сохранения никогда не вызовет уровень обслуживания или уровень представления. Если вы хотите, чтобы код groovy / java существовал в одном и том же слое, убедитесь, что один вызывает другой, но они оба не вызывают друг друга. Суть в том, что вам следует избегать двунаправленных зависимостей.