2011-11-05 34 views
9

javac có thể biên dịch từ stdin không? Something như thế này:javac có thể biên dịch từ stdin không?

cat myfile | javac 
+3

Mục đích thiết thực cho điều đó là gì? –

+0

Tôi nghĩ ý định có thể là để thử nghiệm các lệnh đơn giản (ví dụ: Float.parseFloat mới ("")) để xem chúng sẽ làm gì.Ngoài ra, có thể để thử và sử dụng java cho những thứ như sed một lót, vv Loại giống như một LinqPad mini cho java ;-) –

Trả lời

5

Không, không có tùy chọn để làm điều đó.

Từ documentation:

Có hai cách để vượt qua tên tập tin mã nguồn để javac:

  • Đối với một số lượng nhỏ các file nguồn, chỉ cần liệt kê tên tập tin trên dòng lệnh .
  • Đối với một số lượng lớn tệp nguồn, hãy liệt kê tên tệp trong tệp, được phân tách bằng khoảng trắng hoặc dấu ngắt dòng. Sau đó, sử dụng tên tệp danh sách trên dòng lệnh javac, bắt đầu bằng ký tự @.

tên tập tin mã nguồn phải có java hậu tố, tên tập tin lớp phải có hậu tố .class, và cả hai nguồn và lớp tập tin phải có tên gốc mà xác định các lớp. Ví dụ, một lớp được gọi là MyClass sẽ được viết trong một tệp nguồn có tên là MyClass.java và được biên dịch thành một tệp lớp bytecode có tên là MyClass.class.

1

Bạn có thể thử với /dev/stdin như các tập tin nguồn (và sau đó, bạn sẽ cần phải tìm các tùy chọn mà buộc javac để xem xét nó như là mã nguồn Java).

Nhưng tôi sẽ chỉ tạo một tập lệnh shell để đặt tiêu chuẩn trên một số tệp tạm thời được gắn với .java.

Nhưng tôi nghĩ rằng (tôi không chắc chắn) rằng javac thực sự muốn một lớp học Foo được xác định bên trong một tệp có tên Foo.java.

+0

Có thể không có tùy chọn với Java của Sun để làm điều đó. Với 'gcj' có lẽ là một. –

0

Điều này là không thể với javac đơn giản - lý do là hầu hết các chương trình Java bao gồm nhiều hơn một lớp, thường cũng được phân phối trên nhiều tệp nguồn (đơn vị biên dịch).

Bạn có thể xây dựng một công cụ thực hiện điều này, sử dụng API trình biên dịch Java để biên dịch thực tế.

Bạn sẽ phải tạo một JavaFileManager mô phỏng tập tin theo văn bản từ đầu vào tiêu chuẩn và chuyển nó tới trình biên dịch.

1

Bạn không thể làm điều đó với Sun java, nhưng bạn có thể viết một kịch bản để xử lý việc chuyển đổi stdin thành thứ javac có thể hiểu được.

Giống như kịch bản Python này:

import fileinput, re, subprocess 

class_name = None 

buffer = [] 
class_matcher = re.compile('\w+ class (?P<name>\w+)') 

for line in fileinput.input(): 
    if None == class_name: 
     buffer.append(line) 
     m = class_matcher.match(line) 
     if m: 
      class_name = m.group('name') 
      print "found %s" % class_name 
      file_name = '%s.java' % class_name 
      out = open(file_name, 'wb') 
      out.writelines(buffer) 
    else: 
     out.write(line) 

if None == class_name: 
    print "Error: no class found" 

else: 
    out.close() 

    print 'javac %s' % file_name 
    output = subprocess.call(['javac', file_name]) 

Lưu ý rằng kịch bản sẽ tạo ra một tập tin tên của lớp trong thư mục hiện hành. Nó có thể tốt hơn để sử dụng một cái gì đó trong/tmp, nhưng hãy nhớ rằng nó phải được đặt tên giống như lớp. Nếu bạn đang thử nghiệm tập lệnh không làm điều gì đó như thế này:

cat MyImportantJava.java | python javac-stdin.py 
Các vấn đề liên quan