2010-05-03 27 views
21

Tôi có bạn này ....Cách tốt nhất để hiện đại hóa ứng dụng J2EE 2002?

Tôi có người bạn này làm việc trên ứng dụng java ee (j2ee) bắt đầu vào đầu những năm 2000. Hiện tại họ thêm một tính năng ở đây và ở đó, nhưng có một codebase lớn. Trong những năm qua đội đã giảm 70%.

[Có, "tôi có bạn này là". Đó là tôi, cố gắng một cách hài hước tiêm thiếu niên cố vấn xấu hổ trung học vào trộn]

Java, Vintage 2002

Ứng dụng sử dụng EJB 2.1, thanh chống 1.x, DAO của vv với các cuộc gọi jdbc thẳng (hỗn hợp các thủ tục được lưu trữ và các câu lệnh đã được chuẩn bị). Không có ORM. Đối với bộ nhớ đệm, họ sử dụng một hỗn hợp của OpenSymphony OSCache và một lớp bộ nhớ cache được phát triển tại nhà.

Trong vài năm qua, họ đã nỗ lực để hiện đại hóa giao diện người dùng bằng cách sử dụng các kỹ thuật và thư viện ajax . Điều này chủ yếu liên quan đến javascript libaries (jquery, yui, vv).

Client Side

Về phía khách hàng, việc thiếu đường dẫn nâng cấp từ Struts1 để struts2 can ngăn họ chuyển sang struts2. Các khung công tác web khác trở nên phổ biến (wicket, spring, jsf). Struts2 không phải là "người chiến thắng rõ ràng". Việc chuyển tất cả giao diện người dùng hiện có từ Struts1 sang Struts2/wicket/etc dường như không mang lại nhiều lợi ích cận biên với chi phí rất cao. Họ không muốn có một sự chắp vá của công nghệ-du-jour (hệ thống phụ X trong struts2, hệ thống phụ Y trong Wicket, vv) để phát triển viết các tính năng mới sử dụng Struts 1.

Server Side

On phía máy chủ, họ nhìn vào chuyển sang ejb 3, nhưng chưa bao giờ có động lực lớn. Các nhà phát triển đều cảm thấy thoải mái với ejb-jar.xml, EJBHome, EJBRemote, rằng "ejb 2.1 là" đại diện cho đường đi của kháng cự ít nhất.

Một khiếu nại lớn về môi trường ejb: các lập trình viên vẫn giả vờ "máy chủ ejb chạy trong jvm riêng biệt so với động cơ servlet". Không có máy chủ ứng dụng nào (jboss/weblogic) đã từng thực thi sự tách biệt này. Nhóm nghiên cứu chưa bao giờ triển khai máy chủ ejb trên một hộp riêng biệt, sau đó là máy chủ ứng dụng.

Tệp tai chứa nhiều bản sao của cùng một tệp jar; một cho 'lớp web' (foo.war/WEB-INF/lib) và một cho phía máy chủ (foo.ear /). Máy chủ ứng dụng chỉ tải một bình. Các bản sao làm cho sự mơ hồ.

Caching

Đối với bộ nhớ đệm, họ sử dụng một số triển khai bộ nhớ cache: cache OpenSymphony và một bộ nhớ cache trong nước. Jgroups cung cấp hỗ trợ phân cụm

Bây giờ còn gì?

Câu hỏi: Nhóm hiện có chu kỳ dự phòng để đầu tư hiện đại hóa ứng dụng? Nhà đầu tư thông minh sẽ chi tiêu cho họ ở đâu?

Tiêu chí chính:

1) tăng năng suất. Cụ thể là giảm thời gian phát triển các tính năng hệ thống con mới và giảm bảo trì. 2) hiệu suất/khả năng mở rộng.

Họ không quan tâm đến tín dụng thời trang hoặc kỹ thuật đường phố.

Bạn nghĩ gì?

Ở bên liên tục Chuyển mọi thứ (hoặc chỉ phát triển mới) sang JPA/JPA2?
Thẳng ngủ đông? Đợi Java EE 6?

Phía máy khách/web-site: Di chuyển (một số hoặc tất cả) sang struts2? wicket? jsf/jsf2?

Đối với bộ nhớ đệm: đất nung? ehcache? kết hợp? gắn bó với những gì họ có? cách tốt nhất để tận dụng các kích thước heap khổng lồ mà các jvms 64 bit cung cấp?

Xin cảm ơn trước.

Trả lời

7

Thật sự rất khó để biện minh cho một cái gì đó tái cấu trúc mà "tác phẩm" như vậy. Bạn dành rất nhiều công sức để trở lại nơi bạn bắt đầu.

Điều đó nói.

Chuyển đổi từ EJB 2.1 Phiên sang EJB 3 là khá tầm thường. Đối với chúng tôi, khi chúng tôi thực hiện chuyển đổi, hầu hết các EJB của chúng tôi được triển khai riêng biệt hơn là trong một EAR kết hợp. Nhưng bạn không có vấn đề đó. Ngay cả với EJB 3, bạn rất có thể vẫn có tệp ejb-jar.xml (hoặc tệp).

Nhưng, vẫn còn lợi ích, tôi nghĩ và chi phí rất thấp. Bạn có thể từng bước làm điều đó, đậu theo bean so với "tất cả cùng một lúc", điều này rất hay, đơn giản bằng cách di chuyển phần lớn thông tin trong các tệp ejb-jar.xml hiện tại vào các chú thích trong ứng dụng. Nếu không có gì khác, nó sẽ mang lại khả năng hiển thị (như yêu cầu giao dịch, v.v.) vào mã và không "ẩn đi" trong các tệp ejb-jar.xml.

Không có lý do gì để triển khai "tầng ứng dụng" trên một máy chủ/máy chủ riêng biệt. Lớp web có gọi là bean phiên từ xa không? vs Địa phương? Bạn có thể hoặc không thấy tốc độ bằng cách chuyển sang cuộc gọi cục bộ (nhiều triển khai "cùng nằm" có thể được thực hiện tương tự như lời gọi cục bộ trên một số máy chủ nếu được định cấu hình đúng, dunno nếu bạn đang thực hiện điều đó).

Rủi ro lớn nhất khi chuyển sang cục bộ là với cuộc gọi từ xa, các đối số của bạn "an toàn" không bị thay đổi, vì chúng được đăng trên mạng.Với ngữ nghĩa cục bộ, nếu bạn thay đổi giá trị của một đối số, có mục đích hay không, (tức là, thay đổi giá trị của một thuộc tính trong một bean), thay đổi đó sẽ được phản ánh trong người gọi. Điều đó có thể hoặc không có thể là một vấn đề. Nếu họ đã sử dụng ngữ nghĩa cuộc gọi cục bộ, ngay cả đối với một bean "từ xa", thì họ đã gặp sự cố này.

Đối với JPA và SQL, tôi sẽ để nguyên như vậy. Nó không đáng làm lại toàn bộ tầng dữ liệu thành swtich thành JPA và nếu bạn thực sự muốn các lợi ích của thời gian chạy JPA (so với thời gian phát triển), đặc biệt là bộ nhớ đệm, v.v ... thì bạn phải chuyển đổi lớp dữ liệu TOÀN BỘ (hoặc ít nhất là lớn) các phần của các phần liên quan) cùng một lúc. Thực sự nguy hiểm và dễ bị lỗi.

Đối với sự cố "trùng lặp lọ", đó là một tạo tác bao bì và xây dựng, không phải triển khai. Để khắc phục vấn đề mơ hồ, bạn cần phải làm việc trên môi trường phát triển của mình để sử dụng kho chứa jar được chia sẻ và nhận thức được thực tế là nếu bạn nâng cấp jar cho một, bạn sẽ nâng cấp nó cho tất cả. Mọi người giải thích rằng đó là một nhu cầu không hợp lý, buộc toàn bộ ứng dụng phải nâng cấp nếu một cái bình thay đổi. Đối với các ứng dụng khổng lồ, khác biệt, chắc chắn. Nhưng đối với các ứng dụng trong một JVM duy nhất, không, nó không phải. Nhiều như chúng tôi muốn mỗi một chút để trở thành một thế giới bị cô lập trong món súp đầy ắp, chúng tôi gọi là môi trường trình nạp lớp Java, nó đơn giản là không đúng sự thật. Và chúng ta càng có thể giữ cho đơn giản hơn, chúng ta càng tốt về mặt phức tạp và bảo trì. Đối với các lọ thông thường, bạn cân nhắc việc gộp các lọ đó vào máy chủ ứng dụng và ra khỏi ứng dụng. Tôi không thích cách tiếp cận đó, nhưng nó có nó sử dụng nếu bạn có thể làm cho nó làm việc cho bạn. Nó chắc chắn làm giảm kích thước triển khai.

Phía máy khách, không khó để chuyển đổi từ Struts 1 sang Struts 2, vì cả hai đều rất giống nhau ở mức cao (đáng chú ý là cả hai khung hành động). Chìa khóa ở đây là cả hai khuôn khổ có thể sống cạnh nhau với nhau, cho phép, một lần nữa, thay đổi gia tăng. Bạn có thể từ từ di chuyển mã cũ hơn hoặc bạn chỉ có thể triển khai mã mới trong khung công tác mới. Điều này khác với việc cố gắng trộn và kết hợp một khung hành động và một khung thành phần. Đó là nghĩa đen là một "chó và mèo, sống chung với nhau" tình hình. Nếu tôi đi tuyến đường đó, tôi chỉ đơn giản là triển khai các thành phần trong WAR của riêng họ và tiếp tục. Việc quản lý nhà nước của các khung thành phần làm cho hoạt động tương tác với chúng ở mặt sau thực sự rắc rối. Nếu bạn chọn thực hiện thông qua một WAR mới, hãy chắc chắn bạn dành một chút thời gian làm một số loại "Đăng nhập một lần" để mọi người "đăng nhập" vào từng mô-đun thích hợp. Miễn là các ứng dụng không chia sẻ bất kỳ trạng thái phiên nào, điều này là xa như sự tích hợp thực sự cần phải đi. Và một khi bạn đã chọn để thêm một hệ thống con mới thông qua một WAR mới, bạn có thể sử dụng bất kỳ công nghệ nào bạn muốn cho phía máy khách.

Caching là một vấn đề khác. Các bộ đệm khác nhau giải quyết các vấn đề khác nhau. Đó là một điều để lưu trữ và ghi nhớ một số bit nhỏ trong hệ thống (như kết xuất JSP) hoặc sử dụng bộ nhớ cache được phân phối để truyền các phiên qua dụ trong quá trình chuyển đổi dự phòng hoặc cân bằng tải. Nó khá khác để có một lớp tên miền dựa trên bộ nhớ cache, nơi sự kiên trì và bộ nhớ đệm được tích hợp rất chặt chẽ. Điều đó phức tạp hơn nhiều. Chỉ cần giữ nó thẳng trong đầu là đau đớn.

Trước đây, bạn có thể sử dụng nhiều ứng dụng khi bạn gặp phải nhu cầu, và những loại cache này có thể đứng yên một mình chứ không phải là một phần của khung đệm lưu trữ được điều phối.

Loại thứ hai, là khác nhau. Ở đó, bạn cần phải làm lại toàn bộ mô hình dữ liệu của mình, ngay cả đối với các phần mà bạn không lưu vào bộ đệm, vì bạn muốn đảm bảo rằng bạn có quyền truy cập nhất quán vào dữ liệu và chế độ xem bộ nhớ cache của nó. Đây là những gì JPA có hiệu quả, với hai cấp độ bộ nhớ đệm của nó, và tại sao tôi đã đề cập trước đó, nó không phải là thứ bạn có thể tình cờ lọt vào một ứng dụng, tiết kiệm cho phần lớn các hệ thống của bạn. Khi bạn có các mô-đun riêng biệt nhấn cùng một tài nguyên phụ trợ, tính nhất quán của bộ nhớ cache và tính nhất quán sẽ trở thành một vấn đề thực sự, và đó là lý do tại sao bạn muốn những thứ đó được tích hợp trên cả hai hệ thống.

Tâm trí, nó có thể được thực hiện. Bí quyết đơn giản là tích hợp mức truy cập dữ liệu, và sau đó bạn có thể bắt đầu bộ nhớ đệm ở cấp đó. Nhưng nếu bạn có folks thực hiện cuộc gọi SQL trực tiếp, những người phải đi.

Cuối cùng, tôi nghĩ thuật ngữ sử dụng là tiến hóa chứ không phải cuộc cách mạng. Di chuyển sang EJB 3 hoặc 3.1 Tôi không nghĩ rằng phải đau đớn, vì nó khá nhiều Chỉ cần làm việc với EJB 2.1, đó là một lợi ích. Bạn CÓ THỂ có một môi trường "hỗn hợp". Sự tích hợp đau đớn nhất sẽ là nếu bạn sử dụng đậu thực thể, nhưng bạn đã không làm vậy, vì vậy điều đó tốt. Và đối với tất cả những người dùng eJB, khả năng tương thích ngược này trải dài, những gì, gần 10 năm của EJB, là những gì cho phép bạn thực sự giữ một số lượng lớn mã của bạn nhưng vẫn tiếp tục.

+0

Cảm ơn bạn đã trả lời hữu ích. Của bạn và "lội vào mùa xuân" bài bổ sung cho nhau và giải quyết các lĩnh vực quan tâm của chúng tôi. Đối với 'từ xa' so với 'cục bộ', tôi có một chút không rõ ràng. Trong thực tế tất cả các cuộc gọi là địa phương - bởi vì Jboss xử lý các cuộc gọi ejb trong cùng một vm như địa phương. Tôi không lường trước được việc đưa ejb vào vm riêng biệt như tầng web. Chúng tôi sẽ xem xét vấn đề và triển khai 'trùng lặp' của chúng tôi. AFAIK và IIRC các phiên bản trước đó mơ hồ về các lọ jars và jear. (Jboss có mô hình 'flatclassloader' của nó xử lý mọi bình trong tai/chiến tranh bằng nhau. Nhưng đó là một chủ đề khác) – user331465

+0

Yea, Glassfish cũng có " một mô hình một trình nạp lớp trên mỗi EAR, với mô hình "một cho mỗi WAR" là một tùy chọn. Đây là một vấn đề thực sự khi tôi cố gắng kết hợp hai WAR trong cùng một EAR. Thông số EJB không xác định hành vi theo cách này hay cách khác, vì vậy cả hai mô hình đều "tuân thủ", nhưng tôi coi đây là lỗ khi ứng dụng được xây dựng trong hai môi trường khác nhau không thực sự hoán đổi cho nhau, ngay cả khi cả hai được mã hóa " spec ". –

+0

+1 vì câu trả lời này chỉ nhận được 1 lần cập nhật khác tại thời điểm này. –

0

Nếu tôi là bạn, tôi sẽ bắt đầu với các phép đo. Có lẽ mất một vài hoạt động điển hình, tốt nhất là những người gây phiền nhiễu cho người dùng ở tải cao hoặc một cái gì đó, cắt đường dẫn của họ vào một số giai đoạn và đo lượng thời gian được tiêu thụ trong mỗi bước. Khi bạn tìm thấy một bước mất nhiều thời gian, bạn có thể thu hẹp cho đến khi bạn có khả năng là thủ phạm. Nếu đó là DB truy cập có thể bộ nhớ đệm sẽ giúp đỡ vv Bạn có thể tìm thấy một số tối ưu hóa đồng bằng cũ, nhưng đó là okay, quá, phải không?

Nếu bạn đang chạy trên phiên bản ứng dụng cũ hơn. máy chủ, sau đó tôi khuyên bạn nên nâng cấp nó. Nó có hiệu suất tốt hơn thường/khả năng mở rộng, và trong trường hợp của JBoss nó làm cho ý nghĩa hơn vì sự hỗ trợ tốt hơn (có thể tìm thấy thông tin/nguồn nhân lực dễ dàng hơn).

Đối với di chuyển EJB2.1 sang EJB3, tôi đã kiểm tra tiêm phụ thuộc EJB3 so với EJB2.1 JNDI tra cứu và nhanh hơn rất nhiều. Có lẽ việc loại bỏ những thứ của EJBHome cũng làm mọi việc nhanh hơn, mặc dù tôi không biết chắc chắn. Khi bạn di chuyển hoàn toàn sang EJB3, bạn sẽ có JPA và rất dễ để ehcache hoạt động, và tôi có thể nói với bạn rằng ehcache rất hiệu quả. (Tôi cũng không biết làm thế nào nó so sánh với một trong những bạn đang sử dụng hiện nay ..)

0

Tôi hiểu nỗi đau của người bạn :)

Tuy nhiên mới hơn, khuôn khổ sáng hơn sẽ không nhất thiết phải làm cho cuộc sống của người dùng cuối của bạn tốt hơn , sau tất cả những gì bạn được trả tiền. Một số vấn đề đã xảy ra trong một thời gian, lưu dữ liệu để tăng tốc độ, tự động các tham số yêu cầu hệ thống để gọi phương thức, quản lý giao dịch, ghép nối các thành phần liên quan với nhau ... Trong những năm qua, mọi người đã phát triển 'đủ tốt' '.

Cảm giác của tôi là chuyển đổi khung công tác chỉ đáng giá nếu nó mang lại nhiều cải tiến. Ví dụ, nếu chuyển sang một cái gì đó khác cho phép AJAXify ứng dụng của bạn, thì nó có thể là giá trị nó. Nhưng bạn sẽ phải để người dùng cuối cảm thấy sự cải thiện.

Lời khuyên của tôi là bắt đầu tách mô hình kinh doanh của bạn khỏi bất kỳ điều gì khác (DAO, UI, quản lý giao dịch ...), sau đó sẽ dễ dàng hơn để giới thiệu một khung công tác mới (ORM?). Ngay cả khi nó không hoạt động cuối cùng, bạn có thể đã cải thiện chất lượng của codebase bằng cách tách.

0

Thành thật mà nói, bạn có thể có lẽ chỉ thực hiện lại điều toàn bộ trong grails và làm điều đó như 20x nhanh hơn so với mất bao lâu để làm điều đó vào năm 2002;)

Đối với dự án mà tôi hoàn toàn phải sử dụng một Java chồng thực cho, tôi gắn bó với Spring 3.0 và Hibernate 3.5. Bạn thậm chí có thể sử dụng Roo để khởi động dự án một cách nhanh chóng và chỉ cần tắt nó đi nếu bạn không muốn nó nữa. Sử dụng một ý tưởng như IntelliJ để viết mã nhanh chóng.

Thật không may, tôi phải nói điều này không hiệu quả nữa. Trong khi nó là tuyệt vời cho Java nguyên ... nguyên Java chỉ hút trừ khi bạn hoàn toàn cần tất cả mọi thứ Java cung cấp.

Ngoài ra, Ajax thực sự tệ với Spring. Nếu bạn muốn sử dụng ánh xạ cơ sở dữ liệu trong MVC của mình, bạn phải mã hóa chống lại các trình gỡ bỏ Jackson tùy chỉnh ... vì vậy bạn phải phân tích cú pháp JSON thô. Điều này thật khủng khiếp và người dân Spring đã biết được vấn đề. Chúc may mắn nhìn thấy một sửa chữa cấp cao bất cứ lúc nào sớm.

Tôi từng cười với người Ruby on Rails ... nhưng tôi phải trao cho họ, họ đã làm đúng. Đối với các dự án vừa và nhỏ, nó thực sự hoạt động. Và nếu bạn muốn khả năng mở rộng của ngăn xếp Java, Grails là một giải pháp tuyệt vời.

Nếu bạn thực sự, thực sự, thực sự không muốn đi theo hướng đó, thì chỉ cần sử dụng Spring 3.0 hiện đại hóa với Hibernate 3.5 là con đường di chuyển.

+0

Tôi đã nghiên cứu grails (làm việc thông qua một trong những cuốn sách) và thấy nó rất ấn tượng: nó là một ứng cử viên tuyệt vời cho một ứng dụng mới, nhưng tích hợp với một ứng dụng hiện có trông khó khăn hơn. Bạn có thể làm rõ về "ajax là xấu với mùa xuân" không? tức là Spring-in-general hoặc một thành phần/khía cạnh cụ thể của Spring. Tôi không quen thuộc với chi tiết mùa xuân cũng không phải vấn đề của nó với json. cảm ơn – user331465

3

Tôi đã ở một vị trí rất giống với bản thân một vài năm trước đây, với một ứng dụng phức tạp, nguyên khối bao gồm một kết hợp của EJB 1.x và một khung MVC tự phát triển. Di chuyển toàn bộ mọi thứ cùng một lúc không bao giờ là một lựa chọn, tôi cần một cách để làm điều đó một chút tại một thời điểm, mà không phá vỡ bất cứ điều gì, và không cần sự chấp thuận cho một dự án siêu ngân sách.

Công cụ cho phép tôi làm điều này là Spring (v1.2 như lúc đó). Khi bạn loại bỏ tất cả các buzzwords từ Spring, những gì bạn còn lại là một khung công tác đơn giản để tích hợp các thành phần ứng dụng khác nhau, giúp dễ dàng trao đổi các thành phần này cho các lựa chọn thay thế, hiện đại hóa khi bạn đi.

Ví dụ: Spring cung cấp cho bạn integration with Struts 1, giúp việc giới thiệu các thành phần Struts 1 dễ dàng hơn vào "Đường đi". Các ứng dụng Struts của bạn sẽ hoạt động như trước đây, nhưng bây giờ chúng đã có đòn bẩy để có được bản thân hiện đại hóa từ dưới lên.

Tiếp theo, tóm tắt truy cập dữ liệu của Spring sẽ cho phép bạn cắm các DAO JDBC hiện có của bạn và bắt đầu giới thiệu các trừu tượng DA để làm cho chúng trở nên hiện đại hóa dễ dàng hơn. Nếu bạn chọn gắn bó với JDBC, điều đó là tốt, Spring cung cấp extensive JDBC support để làm cho nó cảm thấy ít đá hơn. Nếu bạn muốn tinker với JPA hoặc Hibernate, thì những thứ đó sẽ tích hợp với ứng dụng Spring-managed dễ dàng như JDBC.

Đối với EJB, Mùa xuân có thể wrap the EJB access layer vào thứ gì đó ít tiền sử hơn, khiến chúng dễ nuốt hơn. Khi bạn đã tách lớp máy khách khỏi các thông tin cụ thể về truy cập dữ liệu EJB, bạn có thể, nếu bạn chọn, thay thế các EJB (một lần) với các thành phần được quản lý bằng Spring đơn giản hơn (với bất kỳ điều khiển từ xa, giao dịch, bảo mật hoặc không của họ), hoặc bạn có thể giữ lại EJB (sử dụng EJB3, có lẽ) nếu bạn chọn.

Tóm lại, hãy để Spring tiếp nhận vai trò của ứng dụng "xương sống", trong khi bắt đầu sử dụng cùng các thành phần cũ mà bạn đã có. Sau đó bạn đã tăng tự do để hiện đại hóa, với tốc độ và rủi ro mà bạn quyết định.

Nó sẽ không dễ dàng, nhưng với một số kiên nhẫn và kiên trì, bạn có thể đến nơi bạn muốn đi mà không bị gián đoạn quá nhiều.

+0

Cảm ơn bạn đã phản hồi. 'Chuyển tiếp dần dần sang mùa xuân' cung cấp một số thông tin chi tiết hữu ích. Là một người dùng không phải mùa xuân, tôi quên rằng Spring cung cấp nhiều hơn chỉ là một 'khung công tác web'. Tôi mới dùng stackoverflow và không chắc tại sao tôi không thể chỉ định nhiều câu trả lời cho một câu hỏi, nhưng đó là một sự quăng giữa bạn và câu trả lời khác. Cảm ơn bạn đã cân nhắc. – user331465

1

Được rồi đây là câu trả lời không yêu cầu viết lại bằng ngôn ngữ khác hoặc học mùa xuân và viết 2000 dòng XML. Tư vấn cho bạn bè của bạn để thử triển khai ứng dụng trong glassfish v3, EJB 2.1 sẽ hoạt động (và hoạt động tốt với bất kỳ mã EE 6 mới nào).

Về sau họ có thể phát triển mã mới trong EJB 3.1 và họ có thể tái cấu trúc mã EJB 2.1 cũ khi rảnh rỗi.

Họ có thể tiếp tục sử dụng Struts hoặc từ từ di chuyển mã mới sang JSF/Wicket/???

Tương tự với JPA, di chuyển đến JPA 2 theo tốc độ của riêng chúng mặc dù mô hình miền của chúng có thể yêu cầu điều này xảy ra ở một bang lớn hoặc nhiều bang nhỏ hơn.

Caching? EclipseLink (JPA 2 RI) có một số bộ nhớ đệm khá tốt trên tàu. Read more

Hầu hết tất cả bánh pudding này đều có bằng chứng. Tôi vừa triển khai ứng dụng EJB 3 + Struts 1.3 trong thủy tinh v3 tại nơi làm việc không chỉ đơn giản là nó đã chết đơn giản (một chút nỗ lực mà tôi đã chuyển nó ra khỏi dự án jdeveloper và vào dự án netbeans). bắt đầu tái cấu trúc cho EE 6 mà chúng tôi dự định làm như lỗi hoặc các tính năng được yêu cầu.

Về cơ bản, điều này được chuyển thành "Nếu nó không bị hỏng thì không khắc phục được". tại sao thay đổi làm việc (mặc dù rất cũ) mã? Hãy để nó sống, viết các tính năng mới trong EE 6 và nếu một tính năng chạm vào mã cũ, hãy xem xét tái cấu trúc nó thành EE 6 trong khi bạn đang ở đó.

Hầu hết tất cả, nỗ lực tham gia vào việc này, sẽ được triển khai vào v3 glassfish ...

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