Separating java projects

I have a large java project, and we use maven for our build cycle. This one project is used extensively – in other projects, in various applications, some of which are contained in it and some which are elsewhere… To be honest, it’s a bit of a mess (various bits added on at different times for specific purposes), and I’d like to clean it up a bit. Also, it’s not fully tested (lots of bits have been added on without proper unit and integration testing), and there are some tests that take a long time to run or don’t actually pass… (uh-oh) – so tests are switched off in the maven build cycle (again, uh-oh).

I am thinking about separating this large project into smaller specific projects, such that the ‘final’ sub-project (or several sub-projects) would pick up the various sub-projects that it would need.

My thinking is as follows:

  • if I separate the big project into various sub-projects, this makes it clear what each project’s responsibility is.
  • by separating into sub-projects, I can then clean up the testing of each sub-project individually, and turn on the testing for that sub-project in the maven build cycle.

I am slightly concerned about what impact this might have on the build time.

  • Would imposing a structure on the large project (i.e. into smaller sub-projects) slow the compiler down?

Also, I have a slight concern on what impact this might have editing time in IDEs (we principally use Intellij). Intellij seems to build each project in turn through the dependency tree – i.e. if C depends on B depends on A, and I change A, it won’t try to build B unless A compiles, and so on. Arguably that’s advantageous, but I have found that if – for example, I change an interface in A that is widely used in B and C, it takes some time to fix all the errors from that change…

Another question is how to use factory classes. Some aspects of the project depend on external jars. Occasionally (thankfully not often) these are updated, and we have to migrate. We tend to handle this by using a Factory class which points to the correct versions of the external code (so we don’t have to change all the implementations throughout the code base).

At the moment this is all in the large project, but I am thinking that by switching to sub-
projects, I could develop a new project for the implementation of new external code, make sure that sub-project is fully functional and tested, and then switch the dependencies / factory class in the user project. However, this is made more complicated by the extensive use of interfaces throughout the large project. For example

  • sub-project A – contains interfaces
  • sub-project B – depends on A for interfaces and old external jar
  • sub-project C – depends on B (and thus A and old external jar), and contains a Factory class that uses B’s implementations of interfaces

If I need to change the external jar of B, I can:

  • create sub-project B_ii – again depends on A, and now the new external jar
  • once fully functional, I can add C’s dependency to B_ii, and change the Factory class to use the new implementations of interfaces.
  • when that’s all working, I can then remove C’s dependency to original B, and if desired, remove sub-project B.

  • Is that a sensible way of going about this?

So, in general, my questions are:

  • Does anyone have any experience of breaking up large projects? Are there any tips/tricks that you would be willing to share?
  • What impact did this have on your development and build times?
  • What advice could you offer on structuring such a break-up of such a project?

1

I’m going to take a quick first cut at this (great Q BTW!):

Would imposing a structure on the large project (i.e. into smaller
sub-projects) slow the compiler down?

Not by enough that it matters, the overhead is actually in Maven invocations.

Also, I have a slight concern on what impact this might have editing
time in IDEs (we principally use Intellij). Intellij seems to build
each project in turn through the dependency tree – i.e. if C depends
on B depends on A, and I change A, it won’t try to build B unless A
compiles, and so on. Arguably that’s advantageous, but I have found
that if – for example, I change an interface in A that is widely used
in B and C, it takes some time to fix all the errors from that
change…

Different IDEs have their different strengths with regards to Maven bindings and dependency management. The current state of play seems to be that it mostly just works on the latest Eclipse, Netbeans and IntelliJ – but you will have to teach your developers the emergency double whammy of “Refresh source files from disk and rebuild all related maven projects”.

I find I’m having to do that less and less these days though. Having an SSD drive makes a massive difference here BTW.

snip factory classes paragraphs

Dependency management is incredibly important, regardless of what technology (Maven/Ivy/whatever) use use to help you implement it.

I’d start by getting the extensive reporting out of the Maven dependency plugin and take stock of what you’ve got. Generally speaking you set the dependency in the dependency management of the POM as high up the food chain as possible, but no higher. So if two of your submodules use an external dependency, then haul that into their parent POM and so on and so forth.

Upgrading external JARs should always be done as a proper mini-project. Evaluate why you’re upgrading, alter source code to take advantage of any new features/bug fixes etc. Just bumping the version without this analysis and work will get you into trouble.

So, in general, my questions are:

Does anyone have any experience of breaking up large projects? Are there any >tips/tricks that you would be willing to share?

  • Interfaces and Dependency injection are your friend.
  • Michael Feather’s book on dealing effectively with legacy code is a must read.
  • Integration tests are your friend
  • Splitting the sub projects into foo-api (interfaces only!) and foo-core and having modules only depend on the foo-api helps a great deal and enforces separation
  • Jboss Modules and/or OSGi can help enforce clean separation

What impact did this have on your development and build times?

Very minor impact on dev and build times – a massive gain in time for our overall continuous delivery pipeline.

What advice could you offer on structuring such a break-up of such a project?

Do the little things right and the big things tend to fall out cleanly afterwards. So split things off bit by bit – don’t do a massive restructure of the whole lot unless you’ve got a high percentage of coverage with your integration tests.

Write integration tests before the split – you should more or less get the same result(s) after the split.

Draw diagrams of the modularity you have now and where you want to get to. Design intermediate steps.

Don’t give up – some Yak shaving now builds the foundation for being able to “rapidly build and refactor without fear” Shameless plug -> from Ben and I’s The Well-Grounded Java Developer.

Best of luck!

My take on this is only separate when necessary. However, that brings up the next question: How do I determine if it is necessary?

  • When the artifact is different (i.e. don’t build the EAR, WAR, JAR, integration-testing-jar in the same project).
  • When during the separation you notice that some code needs to exist in more than one artifact refactor them into a new one.
  • When some other project outside your team wants to use something you have in your project.

One reason is the developers have to deal with multiple projects and try to figure out aside from what Java package is what project should it belong to. I’ve been on projects where it became really anemic and had a project that just had four classes implementing one functionality just because that’s the architectural direction. This was also back before Maven was popular so the class paths and what not need to be set up on both the IDE and Ant scripts.

The other reason is you’d have more moving parts to deal with in terms of plumbing the files around and you’d likely have dependency spaghetti before you know it.

Refactoring is also easier within a project rather than across projects.

If build time is an issue then just provide better hardware.

Trang chủ Giới thiệu Sinh nhật bé trai Sinh nhật bé gái Tổ chức sự kiện Biểu diễn giải trí Dịch vụ khác Trang trí tiệc cưới Tổ chức khai trương Tư vấn dịch vụ Thư viện ảnh Tin tức - sự kiện Liên hệ Chú hề sinh nhật Trang trí YEAR END PARTY công ty Trang trí tất niên cuối năm Trang trí tất niên xu hướng mới nhất Trang trí sinh nhật bé trai Hải Đăng Trang trí sinh nhật bé Khánh Vân Trang trí sinh nhật Bích Ngân Trang trí sinh nhật bé Thanh Trang Thuê ông già Noel phát quà Biểu diễn xiếc khỉ Xiếc quay đĩa Dịch vụ tổ chức sự kiện 5 sao Thông tin về chúng tôi Dịch vụ sinh nhật bé trai Dịch vụ sinh nhật bé gái Sự kiện trọn gói Các tiết mục giải trí Dịch vụ bổ trợ Tiệc cưới sang trọng Dịch vụ khai trương Tư vấn tổ chức sự kiện Hình ảnh sự kiện Cập nhật tin tức Liên hệ ngay Thuê chú hề chuyên nghiệp Tiệc tất niên cho công ty Trang trí tiệc cuối năm Tiệc tất niên độc đáo Sinh nhật bé Hải Đăng Sinh nhật đáng yêu bé Khánh Vân Sinh nhật sang trọng Bích Ngân Tiệc sinh nhật bé Thanh Trang Dịch vụ ông già Noel Xiếc thú vui nhộn Biểu diễn xiếc quay đĩa Dịch vụ tổ chức tiệc uy tín Khám phá dịch vụ của chúng tôi Tiệc sinh nhật cho bé trai Trang trí tiệc cho bé gái Gói sự kiện chuyên nghiệp Chương trình giải trí hấp dẫn Dịch vụ hỗ trợ sự kiện Trang trí tiệc cưới đẹp Khởi đầu thành công với khai trương Chuyên gia tư vấn sự kiện Xem ảnh các sự kiện đẹp Tin mới về sự kiện Kết nối với đội ngũ chuyên gia Chú hề vui nhộn cho tiệc sinh nhật Ý tưởng tiệc cuối năm Tất niên độc đáo Trang trí tiệc hiện đại Tổ chức sinh nhật cho Hải Đăng Sinh nhật độc quyền Khánh Vân Phong cách tiệc Bích Ngân Trang trí tiệc bé Thanh Trang Thuê dịch vụ ông già Noel chuyên nghiệp Xem xiếc khỉ đặc sắc Xiếc quay đĩa thú vị
Trang chủ Giới thiệu Sinh nhật bé trai Sinh nhật bé gái Tổ chức sự kiện Biểu diễn giải trí Dịch vụ khác Trang trí tiệc cưới Tổ chức khai trương Tư vấn dịch vụ Thư viện ảnh Tin tức - sự kiện Liên hệ Chú hề sinh nhật Trang trí YEAR END PARTY công ty Trang trí tất niên cuối năm Trang trí tất niên xu hướng mới nhất Trang trí sinh nhật bé trai Hải Đăng Trang trí sinh nhật bé Khánh Vân Trang trí sinh nhật Bích Ngân Trang trí sinh nhật bé Thanh Trang Thuê ông già Noel phát quà Biểu diễn xiếc khỉ Xiếc quay đĩa
Thiết kế website Thiết kế website Thiết kế website Cách kháng tài khoản quảng cáo Mua bán Fanpage Facebook Dịch vụ SEO Tổ chức sinh nhật