Tôi đã trải qua hướng dẫn đó một thời gian trước và có vấn đề rất giống nhau. Tôi đến với một cách tiếp cận khác nhau một chút mà làm việc cho tôi rất độc đáo.
Trước hết, vì nó đã được đề cập trước đó, bạn cần phải giữ loại của POM của bạn như jar
(<packaging>jar</packaging>
) - nhờ đó, appassembler
plugin sẽ tạo ra một tập tin JAR từ lớp học của bạn và thêm nó vào classpath. Vì vậy, nhờ đó, lỗi của bạn sẽ biến mất.
Xin lưu ý rằng hướng dẫn này Tomcat được khởi tạo từ thư mục nguồn ứng dụng. Trong nhiều trường hợp là đủ, nhưng xin lưu ý rằng bằng cách sử dụng phương pháp đó, bạn sẽ không thể sử dụng chú thích Servlet @WebServlet
dưới dạng /WEB-INF/classes
trong nguồn trống và Tomcat sẽ không thể quét các lớp servlet của bạn. Vì vậy, HelloServlet
servlet từ hướng dẫn đó sẽ không hoạt động, trừ khi bạn thêm một số khởi tạo Tomcat bổ sung (cấu hình tài nguyên) như được mô tả here (BTW, bạn sẽ tìm thấy nhiều câu hỏi SO nói về cấu hình tài nguyên đó).
tôi đã làm một chút cách tiếp cận khác nhau:
tôi chạy một org.apache.maven.plugins:maven-war-plugin
plugin (exploded
khung thành) trong package
và sử dụng mà tạo thư mục như thư mục nguồn của tôi của ứng dụng. Với cách tiếp cận đó, thư mục ứng dụng web của tôi sẽ có /WEB-INF/classes
"được điền" với các lớp. Điều đó sẽ cho phép Tomcat thực hiện công việc quét chính xác (nghĩa là các chú thích Servlet @WebServlet
sẽ hoạt động).
Tôi cũng đã phải thay đổi nguồn cung cấp ứng dụng của tôi trong lớp launcher:
public static void main(String[] args) throws Exception {
// Web application is generated in directory name as specified in build/finalName
// in maven pom.xml
String webappDirLocation = "target/embeddedTomcatSample/";
Tomcat tomcat = new Tomcat();
// ... remaining code does not change
Changes để POM mà tôi thêm vào - bao gồm maven-war-plugin
ngay trước appassembler
plugin:
...
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.5</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>exploded</goal>
</goals>
</execution>
</executions>
</plugin>
...
Xin lưu ý rằng Mục tiêu exploded
được gọi.
Tôi hy vọng rằng thay đổi nhỏ sẽ giúp ích cho bạn.
Một lưu ý khác về hướng dẫn đó và xây dựng maven: lưu ý rằng hướng dẫn được viết đơn giản là xây dựng ứng dụng và chạy ứng dụng đó trong Heroku. Tuy nhiên, đó không phải là cách tiếp cận tốt nhất để xây dựng maven.
Đề nghị Maven là bạn nên tuân thủ để sản xuất một tạo phẩm cho mỗi POM. Trong trường hợp của bạn có nên hai hiện vật:
- Tomcat launcher
- Tomcat ứng dụng web
Cả hai nên xây dựng POMs như riêng biệt và tham chiếu như module từ cha mẹ của bạn POM. Nếu bạn nhìn vào sự phức tạp của hướng dẫn đó, nó không có ý nghĩa nhiều để chia thành hai mô-đun. Nhưng nếu các ứng dụng của bạn ngày càng phức tạp hơn (và trình khởi chạy nhận được một số cấu hình bổ sung, vv), nó sẽ tạo ra rất nhiều ý nghĩa để làm cho "sự phân chia" đó. Như một vấn đề của thực tế, có một số "Tomcat launcher" thư viện đã được tạo ra để bạn có thể sử dụng một trong số họ.
Bạn có thể cho biết tập lệnh được tạo (.sh/.bat) trông như thế nào không? – khmarbaise
Kịch bản được tạo có thể được nhìn thấy tại http://pastebin.com/f9gbVMgx - lớp Chính không được tìm thấy trong PROJECTROOT/src/org/stopbadware/dsp/ – Exupery