Có một số bug trong tiện ích Gool Guice làm cho hầu hết hoặc tất cả các đồ thị bị hỏng. Có cách giải quyết hay khắc phục sự cố này không?Có cách nào để Guice Grapher hoạt động không?
Trả lời
Tôi đã sửa đổi câu trả lời của @ wuppi một chút để ẩn đường dẫn lớp và chú thích tên ngẫu nhiên dài để làm cho biểu đồ nhỏ gọn hơn và dễ đọc hơn. answer của anh ấy với mã được chỉnh sửa theo sau:
Tôi thấy phương pháp tiện ích này khá hữu ích và nó không bao giờ pritned đồ thị không chính xác cho tôi.
Liên quan đến lỗi style=invis
: Plugin gool Guice tạo tệp dấu chấm, trong đó tạo kiểu một số cụm từ là ẩn. Các replaceAll()
trong phương pháp được đăng dưới đây hoạt động xung quanh đó. Phần còn lại của mã gần như giống nhau từ ví dụ Guice.
tôi đã kết hợp sửa chữa Scot cho Guice 4.x, trong đó bao gồm câu trả lời của Tim cũng như:
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;
}
}
Tất nhiên bạn có thể tự do tạo ra bất kỳ ảnh Tên khác :)
Khi sử dụng nhiều nhất phiên bản mới của GraphViz, tôi thấy rằng sự thay thế sau đây cũng giúp (nếu không GraphViz từ chối mở file):
s.replaceAll(" margin=(\\S+), ", " margin=\"$1\", ")
Guice 4.x dụ kết hợp Jeff và Tim solutio ns:
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_]*)", "");
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;
}
}
Sửa lỗi nhỏ - trong phiên bản hiện tại của guice-grapher mà tôi đang sử dụng (4.0-beta), từ khóa 'margin' không có khoảng trống phía trước, vì vậy dòng thay thế phải là: s = s .replaceAll ("margin = (\\ S +),", "margin = \" $ 1 \ ","); Nếu không, cảm ơn bạn rất nhiều cho mẫu. – chooks
Thay thế đầu tiênTất cả trong phương thức hideClassPaths() ở trên quá nhiệt tình - nó loại bỏ tên lớp cũng như gói. Phải là
s = s.replaceAll("\\w[a-z\\d_\\.]+\\.([A-Z][A-Za-z\\d_\\$]*)", "$1");
Lưu ý thêm dấu đô la để điều này cũng hoạt động đối với tên lớp nội bộ.
Cảm ơn! Vui lòng xóa câu trả lời này và bình luận hoặc chỉnh sửa câu trả lời sai. –
@JeffAxelrod Tôi đã sao chép mã vào câu trả lời của bạn –
Jeff, tôi không biết bạn có thấy câu trả lời của @ Tim hay không nhưng nó cần cho phiên bản mới nhất của graphviz và Guice 3.0. Tôi chưa thử với phiên bản 4.0 beta. – durron597
@ durron597 được cập nhật, cảm ơn. –