2010-02-03 54 views
14

Tôi đang chạy Eclipse 3.5 và tôi gặp sự cố thường xuyên để kiểm tra chương trình của mình, tôi phải thực hiện khoảng 6-7 lần nhấp chuột trái ngược với một lần nhấp vào nút phát.Chạy nhiều phương thức chính java trong eclipse

Vấn đề là tôi đang viết ứng dụng mạng và do đó tôi có cấu hình chạy cho "Máy chủ" và cấu hình chạy cho "Máy khách". Sau đó, để kiểm tra chương trình của tôi, tôi phải bắt đầu máy chủ, sau đó một khách hàng, sau đó khách hàng khác vv. Có anyway để tự động hóa này vào một cấu hình chạy?

+0

Xem câu hỏi này: http://stackoverflow.com/questions/316761/how-to-launch-multiple-java-programs-with-one-configuration-on-separate-consoles – JesperE

+1

Để tóm tắt tất cả các câu trả lời cho đến thời điểm này: Eclipse không thể làm điều đó, bạn sẽ cần một công cụ khác hoặc một số giải pháp hackish. – lvella

+0

Thực sự có một vé được mở tại trang web Eclipse yêu cầu chức năng này rất giống nhau. Một trong những người đóng góp đã đề xuất một plugin cho phép nhóm nhiều cấu hình khởi chạy hơn và bắt đầu tất cả chúng cùng một lúc. Mặc dù chức năng của nó bị hạn chế nhưng nó thực sự là một công việc tuyệt vời. Mã nguồn được bao gồm để bạn có thể thực hiện các thay đổi nếu cần. Có sẵn ở đây: https://bugs.eclipse.org/bugs/show_bug.cgi?id=39900#attach_177951 –

Trả lời

16

Bạn có thể gọi trực tiếp phương thức chính của bất kỳ lớp nào. Ví dụ, nếu bạn có lớp Server và Client và bạn muốn chạy một máy chủ và hai máy khách, đây là những gì bạn có thể làm.

public class Server { 
    public void main(final String ... $Args) { 
     final Server S = new Server(); 
     S.config($Args); 
     S.run(); 
    } 
} 

public class Client { 
    public void main(final String ... $Args) { 
     final Client C = new Client(); 
     C.config($Args); 
     C.run(); 
    } 
} 

public class Test_ServerClient { 
    public void main(final String ... $Args) { 
     Server.main('server1.cfg'); 
     Client.main('client1.cfg'); 
     Client.main('client2.cfg'); 
    } 
} 

Xong!

Vâng, gần như vậy. Bạn có thể muốn làm một số chậm trễ trước khi gọi chính của khách hàng chỉ để đảm bảo máy chủ được và chạy đúng.

Một người nghĩ vậy. Tất cả các Máy chủ và Máy khách sẽ được chạy trên cùng một JVM. Trong hầu hết trường hợp (bạn chỉ muốn kiểm tra tương tác của nó và không có gì để làm với việc nạp lớp vì nó sẽ hoạt động khác khi chúng/không có trên cùng một JVM), điều này sẽ ổn. Nếu bạn thực sự muốn o làm cho nó chạy trên JVM khác nhau, bạn có thể sử dụng Ant để chạy chúng thay thế.

Something như thế này:

<project name="TestServerClient" default="test" basedir="."> 
    <target name="test"> 
     <java classname="my.Server"> 
     <arg value="server1.cfg"/> 
     <classpath> 
      <pathelement location="dist/test.jar"/> 
      <pathelement path="${java.class.path}"/> 
     </classpath> 
     </java> 
     <java classname="my.Client"> 
     <arg value="client1.cfg"/> 
     <classpath> 
      <pathelement location="dist/test.jar"/> 
      <pathelement path="${java.class.path}"/> 
     </classpath> 
     </java> 
     <java classname="my.Client"> 
     <arg value="client2.cfg"/> 
     <classpath> 
      <pathelement location="dist/test.jar"/> 
      <pathelement path="${java.class.path}"/> 
     </classpath> 
     </java> 
    </target> 
</project>

Vì vậy, bạn chỉ có thể chạy ant này và đó là nó.

Hy vọng điều này sẽ hữu ích.

+0

Bạn cần thêm fork = "yes" vào phần tử

+0

bạn cũng phải đặt chúng trong ... nếu không chúng sẽ không chạy đồng thời –

1

Vâng, tại sao không viết trường hợp thử nghiệm bằng JUnit. Ý tôi là,

  • Chuẩn bị nộp 2 thuộc tính, một cho máy chủ và một cho khách hàng
  • Viết bộ ghép đo, mà bắt đầu một máy chủ và nhiều khách hàng để chạy thử nghiệm
  • Sau đó viết của bạn các trường hợp thử nghiệm dựa trên đó

Tôi biết rằng chúng tôi không nên gọi nó là kiểm tra đơn vị, vì nó sẽ phụ thuộc vào mạng IO. Vì vậy, gọi nó là bất cứ điều gì cảm thấy thích hợp. Đề nghị của tôi chỉ là sử dụng JUnit cho việc này.

1

Bạn có thể viết chương trình khởi động đơn giản sẽ bắt đầu tất cả các chương trình khác trong một JVM mới. Để gọi trong một JVM mới, bạn có thể sử dụng các phương thức Runtime.exec().

Đó là cách thực hiện của nó trong nhiều thử nghiệm đơn vị senarios.

Chương trình khởi động của bạn có thể lấy danh sách các chương trình khác làm đối số và chia nhỏ chúng trong một quy trình java mới.

+0

Ý bạn là, thực hiện việc này cho ứng dụng khách, phải không? – user919860

2

Chỉ cần hoàn thành câu trả lời đã được xác thực: Nếu bạn muốn thực thi máy chủ và máy khách song song, bạn cần bắt đầu một chuỗi mới cho từng cá thể máy khách và máy chủ. Bạn có thể làm điều này như sau:

pulic class Test_ServerClient { 
    public static void main(final String[] args) { 

     Thread serverThread = new Thread() { 
      public void run() { 
       Server.main(args); 
      } 
     }; 

     Thread clientThread = new Thread() { 
      public void run() { 
       Client.main(args); 
      } 
     }; 

     serverThread.start(); 

     try { 
      Thread.sleep(1000); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 

     clientThread.start(); 
    } 
} 

public class Server { 
    public static void main(final String[] args) {...} 
} 

public class Client { 
    public static void main(final String[] args) {...} 
} 
1

Window -> New Window

Chạy các chương trình riêng biệt riêng rẽ.

Các vấn đề liên quan