星期日, 9月 30, 2012

JasperReports compile與JDK版本之問題.

前陣子想說很久沒post文章, 要來回顧一下, 回到 Blogger, 看到有人引用我的文章.
http://michaelyang1988-hotmail-com.iteye.com/blog/1218781
突然覺得, 有幫助到人的感覺真的很不錯, 也給了我些許的動力再寫一些分享...

下面就來分享一下之前碰過 JasperReports 的問題之解決方式...

一般JasperReports使用方式, 會先使用 JDK 去 compile JasperReports 的設計檔之後, 在程式中使用 compile 出來的 jasper 檔案讓 jasperreports去進行產生報表的功能.

但若使用 JDK 1.5 compile的jasper檔案, 若到 JRE 1.4 的版本去運作時, 馬上會出現 UnsupportedClassVersionError 的 Error.

所以必須確定執行環境的 JRE 版本必須小於 compile 的 jasper 版本.

由於客戶端的 JRE, 從 1.4 ~ 1.6 都有, 很多客戶覺得沒事就不要升級.
因此最保險的做法就是確保都用 JDK 1.4 去進行 compile 即可.

而現在只為了這一個功能而去裝 JDK1.4似乎又小題大作.且若忘了用JDK1.4 compile, 到客戶端才會發現此問題...確實造成不少困擾...

用過 JDK 應該都知道, JDK 可以透過下參數的方式 compile 出之前的版本, 而不需要真正裝 JDK 1.4~
由於 JasperReports 也是透過 JDK 進行 compile, 理應也可以下參數來解決. 但查了一下, 似乎沒人有此需求, 經查程式, 連現在最新的 JasperReports 4.7.1 也都無此功能. (我則是使用JasperReports0.5.3, 好悠久的歷史...)

所以最快的方式就是去找出 JasperReports compile 的程式手動加入參數即可.
用關鍵字去找, 很快找出其邏輯...
在 JRDefaultCompiler.java 中可看到, 會依 JRJdk13Compiler, JRJdk12Compiler, JRJavacCompiler 的順序去建立 Compiler 物件. 由於我們使用 sun 1.4 以上之 jdk, 因此只需要調整 JRJdk13Compiler 即可.

在JRJdk13Compiler.java 101 行左右可看到如下:
  public String compileClass(File sourceFile, String classpath) throws JRException
  {
    String[] source = new String[3];
    source[0] = sourceFile.getPath();
    source[1] = "-classpath";
    source[2] = classpath;

找到程式後, 修改就很容易了, 改成如下:
  public String compileClass(File sourceFile, String classpath) throws JRException
  {
    String[] source = new String[7];
    source[0] = sourceFile.getPath();
    source[1] = "-classpath";
    source[2] = classpath;
    source[3] = "-source";
    source[4] = "1.4";
    source[5] = "-target";
    source[6] = "1.4";

重新打包好 jasperreports 的 jar 後, 使用 jdk 1.6 進行 compile, 在 jdk1.4 上 run, 運作成功.
當然此改法是使用 hard code 方式, 對我已經很夠用. 若是要彈性一點, 可加入一些 system properties 或多傳參數等方式來進行判斷是否使用此邏輯等等...


星期一, 9月 24, 2012

Android 開發甘苦談

Android 是使用 Java 語言開發, 之前有朋友說要幫忙基督教寫一些 APP.
問我有沒有意願幫忙. (宗教性質, 真的是幫忙~賺奶粉錢啊...)

有個實戰的機會當然很好~聽起來只是抓youtube的撥放清單出來透過 youtube app 去撥放即可..
就進入開發了.

當時客戶說, 機器(Android電視盒這類的, 並不是手機)是 Android 2.2, 所以在 Android 2.2 上可以跑就好~

所以沒想太多就用 Android 2.2 進行開發.

這是一個很好的經驗, 有了這次經驗真的發現要開發 APP 真不是件容易的事.
要注意很多的細節, 背景處理, UI 操作等的, 才不會做出不 friendly 的產品.

做完交付出去後, 才是惡夢的開始..
Cust: 我的手機怎麼不能跑?
Me: 啊不是說該台Android機器可以跑就好?
Cust: 阿不都是 Android 程式, 應該沒差吧.
Me: 是沒錯, 你的手機是哪一台?
Cust: HTC XXX.
Me: (查了一下) 阿這台是 Android 1.6, 你不是說用 Android 2.2 就可以?
Cust: 那可不可以幫忙調一下?
Me: 好吧, 那我看我用 Android 1.5 來開發調整好了.

抱怨 1: Android 4.x 看的到吃不到. 為了讓各代Android可以用, 只能選最低版本的 API 進行開發...

終於上了 Android Market, 看到自己的程式在 Market 上, 還算是蠻有成就的.
只是, 也領受到了使用者評論真的是很不留情. 


抱怨 2: Android 手機百百款, 真的沒辦法知道該手機為什麼有問題. 

我想客戶可能覺得還算 ok. 所以後來又找我來開發另一個 APP, 可以線上直撥 GOOD TV 電視台..說跟他們現在的 iphone 版一樣就好, 然後就給了我一堆 iphone 版的簡介與圖檔...
PSD 檔, 很好, 光處理這些圖檔去背就讓我試了好幾套圖檔軟體...

由於要線上直撥, 就與 GOOD TV 網頁版一樣, 是透過 Flash 來撥放.
還記得宏X的廣告...Android 什麼都有啊...
但實情是, Flash 在手機上執行真的會拖慢效能, 且表現不穩定.
再加上 Android 裝置這麼多, 每台解析度都不一樣. 有的會有聲音沒影像 , 有的沒聲音有影像..
但基本上透過 wifi 會比較沒問題, 3G 大概卡在網路問題居多...
客戶大概也知道我已經盡力了. 勉勉強強上了線...

抱怨3: 手機用 Android 1.x 2.x平板要用 3.x, Android 4.0 又統一.

上線後不久, 就發現, 在平板上不能撥放...
Android 3.0(平板專用)的向下相容作法是, 把原 APP 等比例放大, 但偏偏就無法撥 flash...

真是讓我大嘆... Android, 我真是搞不懂你啊...
在爬了許多文章以後, 知道要在平板(Android 3.0)跑這些需要硬體加速的, 設定檔需要多設參數才可以. 但此參數只能設在 Android 3.0 的 API 上...

也就是說, 為了平板可以跑, 必須要分兩份 source, 發行多版本模式, Android Market 會根據使用者的裝置, 讓其安裝相對應的APP版本.

想說, 那就此設定檔不同, 打包成兩個 APP 即可.

果然事情不是傻瓜想的那麼簡單...

設定檔宣告為 Android 3.0 版之後, 就不是相容模式了. 跑出來的畫面, 圖檔都變的很小...
所以連圖檔, 都要重新處理...
最後, 由於 Android 3.0 上方不像之前的版本只是一個 Title 文字.
會變成一個扁長的圖片再外加 Title 文字...
若沒設定, 會是 APP icon 的圖(正正方方的圖截掉), 根本不能看.
所以連程式也要跟著調整. 雖然變動不多, 但就要維護兩套程式..


抱怨4: 現在 Android 5.0也決定放棄 Flash 了. 但傷害已經造成...

話說前陣子, 老婆換了一台 Sumsng GIO 這隻手機, 想說要在老婆面前秀一下...
我就興高采列的去安裝了此 APP.
沒想到. 竟然 "不..能..撥..", 才發現, 原來沒裝 Flash...真是大驚小怪...
什麼, Play 上 (Android Market 改名為 Google Play). 竟然找不到官方 Flash 可以裝.
啊不是說從 Android 5 開始才沒有 Flash 嗎....我只是 2.3...

上網找了 solution...這一台要裝 Flash...是可以的, 請依下面步驟安裝. 還要 ROOT 權限, 在網路上下載不知哪裡來的官方 Flash APP...到底是智慧手機還是智障手機啊...
還是放棄...默默的把APP移除...手機還給老婆...

至於最後一套, 畫面與第一套類似(根本就是第一套改一改)....
話雖如此, 但背後運作的需求仍然有不小差異...還碰到 google youtube 調整 playlist 的資料邏輯 的問題~

新眼光電視

真的是很佩服開發 Android APP的工程師...