แก้ปัญหา maven dependency: spring-boot 1.2.5 กับ jstl 1.2.1 และ jasperreports 6.1
เนื่องจากมีน้องเดินมาให้ช่วยดูให้หน่อยว่าทำไมเค้าใส่ dependency ใน pom ของเค้าแล้วมันมีปัญหา เค้าอยากจะใส่ jstl กับ jasper report เข้าไปใน spring-boot project ของเค้า
บางส่วนของ pom ที่เรียกใช้งาน spring-boot 1.2.5
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.2.5.RELEASE</version>
</parent>
...
<dependencies>
...
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
...
</dependencies>
- dependency ตัวนี้
org.springframework.boot.spring-boot-starter-web
จะดึงเอา tomcat embeded version 7 มาให้อยู่แล้ว
JSTL dependency
เริ่มโดยน้องเค้าใส่
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.1</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
- JSP 2.3 มากับ Tomcat 8 แต่ spring-boot 1.2.5 ใช้ embedded tomcat 7 classes มันน่าจะไม่ compatible กันละ
- JSTL จาก group id
javax.servlet
เป็น version 2.0 ซึ่งหากดูใน web site เค้าก็บอกว่ามันย้าย group id ใหม่แล้ว javax.servlet.jsp.jstl - JSTL 2.0 มัน depend กับ jsp-api 2.0 ซึ่งมันก็ขัดกับ jsp-api ที่ระบุเอาไว้ก่อนหน้าอีก
ทีนี้ผมเลยพยายามจะใส่ JSTL 1.2.1 ใหม่ล่าสุดลงไป
ลบ dependency สองตัวข้างบนออกซะ แล้วใส่แบบนี้ลงไปใน pom
<dependencies>
...
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>javax.servlet.jsp.jstl-api</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
...
</dependencies>
- ใส่
org.apache.tomcat.embed.tomcat-embed-jasper
เข้ามาด้วยเพราะว่าตัวนี้จะดึงเอา jsp-api ที่เหมาะสมมาให้เราด้วย, ถ้าจะใช่ jstl ต้องมี jsp-api (javax.servlet.jsp) ตัวspring-boot-starter-web
เราได้มาแต่ servlet-api (javax.servlet)
พอทดสอบ $ mvn spring-boot:run
กลับรันหน้า jsp ของเราไม่ได้ ลองมาเปิด jar ที่อยู่ .m2 ดู ปรากฎว่า jar ที่ได้จาก artifactId jstl มันเป็น jar เน่า มี classes ใน package name ด้วย :( ทำไง ... google ต่อ
คนนี้เค้าบอกวิธีที่ใช้ได้เอาไว้ที่ SO นี้ ขอบคุณครับ ;)
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>javax.servlet.jsp.jstl-api</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>javax.servlet.jsp.jstl</artifactId>
<version>1.2.1</version>
<exclusions>
<!-- jstl-api was adding selvlet-api 2.5 and jsp-api -->
<exclusion>
<artifactId>jstl-api</artifactId>
<groupId>javax.servlet.jsp.jstl</groupId>
</exclusion>
</exclusions>
</dependency>
ต้องไปเอา jstl library จาก groupId ของ glassfish แทน
ต่อมาอยากได้
JasperReport 6.1
จะเอา jasper report ใส่ใน project maven ใส่แบบนี้
<dependency>
<groupId>net.sf.jasperreports</groupId>
<artifactId>jasperreports</artifactId>
<version>6.1.0</version>
</dependency>
มีปัญหาว่าพอให้ maven update dependency มันหา olap4j library ไม่เจอ ใน ecilpse ฟ้องแบบนี้
Missing artifact org.olap4j:olap4j:jar:0.9.7.309-JS-3
ลองกดดูที่ maven central ตาม URL นี้ org.olap4j » olap4j ก็จะเจอ 404 file not found !! ห๊ะ
[404]
Not Found: /artifact/org.olap4j/olap4j/0.9.7.309-JS-3
งงอยู่ซักแพ๊บ google ต่อ มาเจอ คำตอบ ที่นี่เอง
ใน community ของ jaspersoft ว่าเราจะต้องเพิ่ม URL repository ตัวนี้เข้าไปใน maven's proxy ของเราด้วย http://jaspersoft.artifactoryonline.com/jaspersoft/third-party-ce-artifacts/
เมื่อไปเพิ่ม URL ข้างต้นใน Artifactory virtual repository แล้วก็ update dependency ใหม่อีกครั้ง ที่นี้ก็ทำงานต่อได้แล้ว
เผอิญว่าที่ทำงาน ผมตั้ง Artifactory server เป็น maven proxy เอาไว้ ก็เลยเจอปัญหานี้ หาก maven ได้วิ่งออก internet ตรงๆ ก็คงไม่เป็นไร
ไม่มีความคิดเห็น :
แสดงความคิดเห็น