But I feel things have improved over time. Dropwizard, gradle, embedded jetty, jersey, guava, Spring boot, etc... The trend is towards minimizing configuration and overall, the ecosystem has become somewhat more manageable. I wouldn't necessarily call it pleasant, but it's better.
An as for the language itself, Java8's lambdas + streams provide significant improvements.
Compare this (Java 7):
public static List<Integer> sortDescending(List<Integer> ints) {
ints.sort(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1.equals(o2) ? 0 : o1 < o2 ? 1 : -1;
}
});
return ints;
}
to this (Java 8): public static List<Integer> sortDescending2(List<Integer> ints) {
ints.sort((o1, o2) -> o1.equals(o2) ? 0 : o1 < o2 ? 1 : -1);
return ints;
}
(Example is contrived, since you could use the built in Collections.reverse() to achieve the same result. My main point is that we have eliminated ~4 lines (counting braces) of ceremony.)All that said, I'd rather be using Clojure.