Я немного изменил ответ @ wuppi, чтобы также скрыть пути классов и длинные аннотации случайных имен, чтобы сделать график намного более компактным и читаемым. Его ответ с отредактированным кодом следует:
Я считаю этот метод довольно полезным, и он никогда не печатал неправильные графики для меня.
Относительно ошибки style=invis
: плагин Guice grapher генерирует точечный файл, который стилизует некоторые фразы как невидимые. replaceAll()
в приведенном ниже методе работает вокруг этого. Остальная часть кода почти такая же, как в примере с Guice.
Я включил исправление Скотта для Guice 4.x, которое также включало ответ Тима:
public class Grapher {
public static void main(String[] args) throws Exception {
Grapher.graph4("filename.dot", Guice.createInjector(new MyModule()));
}
public static void graph4(String filename, Injector inj) throws Exception {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PrintWriter out = new PrintWriter(baos);
Injector injector = Guice.createInjector(new GraphvizModule());
GraphvizGrapher renderer = injector.getInstance(GraphvizGrapher.class);
renderer.setOut(out);
renderer.setRankdir("TB");
renderer.graph(inj);
out = new PrintWriter(new File(filename), "UTF-8");
String s = baos.toString("UTF-8");
s = fixGrapherBug(s);
s = hideClassPaths(s);
out.write(s);
out.close();
}
public static String hideClassPaths(String s) {
s = s.replaceAll("\\w[a-z\\d_\\.]+\\.([A-Z][A-Za-z\\d_\\$]*)", "$1");
s = s.replaceAll("value=[\\w-]+", "random");
return s;
}
public static String fixGrapherBug(String s) {
s = s.replaceAll("style=invis", "style=solid");
s = s.replaceAll("margin=(\\S+), ", " margin=\"$1\", ");
return s;
}
}
Конечно, вы можете создать любое другое имя файла:)