Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Javaのバージョニング問題
の話しよっか
室星亮太
2016/01/21(木)(第1回(ゆるゆる高専エンジニアLT大会(at(FULLER
突然ですが問題です
このクラスを含むライブラリがあります(core_v1.jar)
package com.mrstar.versioning_problem.core;
public final class Core {
private Core() {}
pu...
さっきのライブラリに依存するライブラリがあります(framework.jar)
package com.mrstar.versioning_problem.framework;
import com.mrstar.versioning_prob...
こんな感じで使います
package com.mrstar;
import com.mrstar.versioning_problem.framework.Framework;
public class Main {
public static...
実行すると...
package com.mrstar;
import com.mrstar.versioning_problem.framework.Framework;
public class Main {
public static v...
こっからがポイントです
もうちょっと状況説明が続きます
仮の文言を本番用に変更し、バージョンアップ(core_v2.jar)
package com.mrstar.versioning_problem.core;
public final class Core {
private Core() {}...
core_v2.jarに置き換えて、framework.jarはそのままで
package com.mrstar;
import com.mrstar.versioning_problem.framework.Framework;
public...
Q1#「Framework.showTitle();」
• 「ほげふが」って表示されると思う人?
• 「メインページ」って表示されると思う人?
Q2#「Framework.showMessage();」
• 「ぴよぴよ!」って表示されると思う人?
• 「こんにちは!」って表示されると思う人?
答え合わせ!
Q1#Framework.showTitle()は
「メインページ」って表示されます
 
Q2#Framework.showMessage()は
「ぴよぴよ!」って表示されます
あってた?
解説!
framework.jarのFramework.java(再掲)
package com.mrstar.versioning_problem.framework;
import com.mrstar.versioning_problem.cor...
これをコンパイルした結果がポイント!
framework.jarの中身をデコンパイルすると...
デコンパイルしたFramework.class
package com.mrstar.versioning_problem.framework;
import com.mrstar.versioning_problem.core.Core;
p...
気づいた?
もう一回みてみましょう!
Framework.javaのコード
package com.mrstar.versioning_problem.framework;
import com.mrstar.versioning_problem.core.Core;
public...
デコンパイルしたFramework.class
package com.mrstar.versioning_problem.framework;
import com.mrstar.versioning_problem.core.Core;
p...
おわかりいただけましたか?
デコンパイルした.class
Core.MESSAGEの文字列リテラルの「ぴよぴよ」
直接埋め込まれていましたね!
Core.MESSAGEの文字列リテラル、
直接埋め込まれていましたね!
public'sta+c'final'String'MESSAGE'(略)
直接埋め込まれていましたね!
バージョニング問題!
用語自体はC#のもの
public'sta+c'final'intやpublic'sta+c'final'String
等クラス定数の箇所はコンパイルすると
数値・文字列リテラルに展開されます!
framework.jarは
core_v1.jarに依存しビルドしました
その後、再ビルドしませんでしたね
framework.jarを再ビルドするまで、Framewarkクラス内の
Coreクラスの定数Core.MESSAGEを使っている箇所は
core_v1の「ぴよぴよ」のままです
想像してください!
製品版のプログラムでテスト用の文言が出てきてしまうのを!
((((;゚Д゚))))
まぁぶっちゃけ
ピヨピヨ
とか、かわいいもんだよね(汗)
「ここに射幸心をジャブジャブ る文言」
笑えないね
ポイントおさらい
public'sta+c'final'intみたいな定数は
コンパイルするとリテラルとして展開される
※プリミティブ型とString型
「framework.jar再ビルドすりゃよくね?」
まぁそうなんだけど、Java書くならこれは知っといてほしい
定数が埋め込まれて思わぬバグの原因になるから!
遅くなりましたが自己紹介
• 室星亮太
• 最初はJavaでAndroid+(2016年でもJava6+orz)
• 最近までC#でUnity+(2016年でもC#3.0(一部4.0)+orz)
• 今はTypeScriptでNode.js+(...
「バージョニング問題、稀なケースなんでしょ?」
わたしもそう思っていた時期がありました。
去年遭遇しました
Unity&+&Android&+&ある広告SDKで
またまた問題です!
今度はAndroid経験者が対象
Androidでpublic,sta0c,final,int
なよく使うやつってな∼んだ!?
Rクラス
R.layout.activity_mainのようなリソースID
レイアウトや画像に振られるリソースID(intな定数)
Rクラスのパッケージ名はアプリのパッケージ名に
RクラスのリソースID利用例
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {...
Unity&+&Android&+&ある広告SDKで
バージョニング問題が原因の不具合に遭遇!
Unity+Android+ある広告SDKの構成例
これはUnity4までのやり方で現在は非推奨
レイアウトのXMLや画像などのリソース
上記リソースを使う広告表示機能のjar
(AndroidManifest.xml)
jarの中のクラスでは、R.layout.activity_main
みたいなリソースIDの定数、リテラルとして展開されてるよね!
Unityはビルド時、Androidのアプリを作るため
新たにAndroidプロジェクトを作って
このタイミングでリソースに再度リソースIDが振られます
jarの中のクラスでは、R.layout.activity_main
みたいなリソースIDの定数、リテラルとして展開されてるよね!
もし
プラグインが二つになったら
プラグインが二つになったら
この状態でAndroidプロジェクトを作り
リソースIDを振り直したら
プラグインのJarの中の整数リテラルと
Unityが新たに作るリソースIDの整数が
ずれる!
実行時エラー!
タチが悪い
public'sta+c'final'intがベタ書きされた
jarを作ったSDK開発者が悪い!
jarの中のリソースIDとUnityが作るAndroidプロジェクトのリソースIDとが一致しない!
最悪、非常にギルティ
さてさて、
バージョニング問題
理解してもらえましたか?
みんなバージョニング問題を
引き起こしそうなライブラリ
作っちゃいけませんよ!
約束な!
Javaのバージョニング問題の話しよっか
 
室星亮太
2016/01/21(木)(第1回(ゆるゆる高専エンジニアLT大会(at(FULLER
Javaのバージョニング問題の話しよっか
Javaのバージョニング問題の話しよっか
Javaのバージョニング問題の話しよっか
Javaのバージョニング問題の話しよっか
Javaのバージョニング問題の話しよっか
Upcoming SlideShare
Loading in …5
×

Javaのバージョニング問題の話しよっか

1,020 views

Published on

2016/01/21(木)に行われた第1回ゆるゆる高専エンジニアLT大会 at FULLER

の発表資料です。

Published in: Technology
  • Be the first to comment

  • Be the first to like this

Javaのバージョニング問題の話しよっか

  1. 1. Javaのバージョニング問題 の話しよっか 室星亮太 2016/01/21(木)(第1回(ゆるゆる高専エンジニアLT大会(at(FULLER
  2. 2. 突然ですが問題です
  3. 3. このクラスを含むライブラリがあります(core_v1.jar) package com.mrstar.versioning_problem.core; public final class Core { private Core() {} public static String getTitle() { return "ほげふが"; } public final static String MESSAGE = "ぴよぴよ!"; }
  4. 4. さっきのライブラリに依存するライブラリがあります(framework.jar) package com.mrstar.versioning_problem.framework; import com.mrstar.versioning_problem.core.Core; public class Framework { private Framework(){ } public static void showTitle() { System.out.println(Core.getTitle()); } public static void showMessage() { System.out.println(Core.MESSAGE); } }
  5. 5. こんな感じで使います package com.mrstar; import com.mrstar.versioning_problem.framework.Framework; public class Main { public static void main(String[] args) { Framework.showTitle(); Framework.showMessage(); } }
  6. 6. 実行すると... package com.mrstar; import com.mrstar.versioning_problem.framework.Framework; public class Main { public static void main(String[] args) { Framework.showTitle(); // 「ほげふが」って表示される Framework.showMessage(); // 「ぴよぴよ!」って表示される } }
  7. 7. こっからがポイントです もうちょっと状況説明が続きます
  8. 8. 仮の文言を本番用に変更し、バージョンアップ(core_v2.jar) package com.mrstar.versioning_problem.core; public final class Core { private Core() {} public static String getTitle() { return "メインページ"; // さっきまで「ほげふが」 } // さっきまで「ぴよぴよ!」 public final static String MESSAGE = "こんにちは!"; }
  9. 9. core_v2.jarに置き換えて、framework.jarはそのままで package com.mrstar; import com.mrstar.versioning_problem.framework.Framework; public class Main { public static void main(String[] args) { Framework.showTitle(); // Q1 なんて表示される? Framework.showMessage(); // Q2 なんて表示される? } }
  10. 10. Q1#「Framework.showTitle();」 • 「ほげふが」って表示されると思う人? • 「メインページ」って表示されると思う人?
  11. 11. Q2#「Framework.showMessage();」 • 「ぴよぴよ!」って表示されると思う人? • 「こんにちは!」って表示されると思う人?
  12. 12. 答え合わせ!
  13. 13. Q1#Framework.showTitle()は 「メインページ」って表示されます   Q2#Framework.showMessage()は 「ぴよぴよ!」って表示されます
  14. 14. あってた?
  15. 15. 解説!
  16. 16. framework.jarのFramework.java(再掲) package com.mrstar.versioning_problem.framework; import com.mrstar.versioning_problem.core.Core; public class Framework { private Framework(){ } public static void showTitle() { System.out.println(Core.getTitle()); } public static void showMessage() { System.out.println(Core.MESSAGE); } }
  17. 17. これをコンパイルした結果がポイント! framework.jarの中身をデコンパイルすると...
  18. 18. デコンパイルしたFramework.class package com.mrstar.versioning_problem.framework; import com.mrstar.versioning_problem.core.Core; public class Framework { private Framework() {} public static void showTitle() { System.out.println(Core.getTitle()); } public static void showMessage() { System.out.println("ぴよぴよ!"); } }
  19. 19. 気づいた? もう一回みてみましょう!
  20. 20. Framework.javaのコード package com.mrstar.versioning_problem.framework; import com.mrstar.versioning_problem.core.Core; public class Framework { private Framework(){ } public static void showTitle() { System.out.println(Core.getTitle()); } public static void showMessage() { System.out.println(Core.MESSAGE); } }
  21. 21. デコンパイルしたFramework.class package com.mrstar.versioning_problem.framework; import com.mrstar.versioning_problem.core.Core; public class Framework { private Framework() {} public static void showTitle() { System.out.println(Core.getTitle()); } public static void showMessage() { System.out.println("ぴよぴよ!"); } }
  22. 22. おわかりいただけましたか?
  23. 23. デコンパイルした.class Core.MESSAGEの文字列リテラルの「ぴよぴよ」 直接埋め込まれていましたね!
  24. 24. Core.MESSAGEの文字列リテラル、 直接埋め込まれていましたね!
  25. 25. public'sta+c'final'String'MESSAGE'(略) 直接埋め込まれていましたね!
  26. 26. バージョニング問題! 用語自体はC#のもの
  27. 27. public'sta+c'final'intやpublic'sta+c'final'String 等クラス定数の箇所はコンパイルすると 数値・文字列リテラルに展開されます!
  28. 28. framework.jarは core_v1.jarに依存しビルドしました その後、再ビルドしませんでしたね
  29. 29. framework.jarを再ビルドするまで、Framewarkクラス内の Coreクラスの定数Core.MESSAGEを使っている箇所は core_v1の「ぴよぴよ」のままです
  30. 30. 想像してください! 製品版のプログラムでテスト用の文言が出てきてしまうのを!
  31. 31. ((((;゚Д゚))))
  32. 32. まぁぶっちゃけ ピヨピヨ とか、かわいいもんだよね(汗)
  33. 33. 「ここに射幸心をジャブジャブ る文言」 笑えないね
  34. 34. ポイントおさらい public'sta+c'final'intみたいな定数は コンパイルするとリテラルとして展開される ※プリミティブ型とString型
  35. 35. 「framework.jar再ビルドすりゃよくね?」 まぁそうなんだけど、Java書くならこれは知っといてほしい 定数が埋め込まれて思わぬバグの原因になるから!
  36. 36. 遅くなりましたが自己紹介 • 室星亮太 • 最初はJavaでAndroid+(2016年でもJava6+orz) • 最近までC#でUnity+(2016年でもC#3.0(一部4.0)+orz) • 今はTypeScriptでNode.js+(JavaScriptむずいね)
  37. 37. 「バージョニング問題、稀なケースなんでしょ?」
  38. 38. わたしもそう思っていた時期がありました。
  39. 39. 去年遭遇しました Unity&+&Android&+&ある広告SDKで
  40. 40. またまた問題です! 今度はAndroid経験者が対象
  41. 41. Androidでpublic,sta0c,final,int なよく使うやつってな∼んだ!?
  42. 42. Rクラス
  43. 43. R.layout.activity_mainのようなリソースID レイアウトや画像に振られるリソースID(intな定数) Rクラスのパッケージ名はアプリのパッケージ名に
  44. 44. RクラスのリソースID利用例 public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // これ!!!ビルドすると整数リテラルに setContentView(R.layout.activity_main); } }
  45. 45. Unity&+&Android&+&ある広告SDKで バージョニング問題が原因の不具合に遭遇!
  46. 46. Unity+Android+ある広告SDKの構成例 これはUnity4までのやり方で現在は非推奨
  47. 47. レイアウトのXMLや画像などのリソース 上記リソースを使う広告表示機能のjar (AndroidManifest.xml)
  48. 48. jarの中のクラスでは、R.layout.activity_main みたいなリソースIDの定数、リテラルとして展開されてるよね!
  49. 49. Unityはビルド時、Androidのアプリを作るため 新たにAndroidプロジェクトを作って このタイミングでリソースに再度リソースIDが振られます
  50. 50. jarの中のクラスでは、R.layout.activity_main みたいなリソースIDの定数、リテラルとして展開されてるよね!
  51. 51. もし
  52. 52. プラグインが二つになったら
  53. 53. プラグインが二つになったら
  54. 54. この状態でAndroidプロジェクトを作り リソースIDを振り直したら
  55. 55. プラグインのJarの中の整数リテラルと Unityが新たに作るリソースIDの整数が ずれる!
  56. 56. 実行時エラー!
  57. 57. タチが悪い
  58. 58. public'sta+c'final'intがベタ書きされた jarを作ったSDK開発者が悪い! jarの中のリソースIDとUnityが作るAndroidプロジェクトのリソースIDとが一致しない!
  59. 59. 最悪、非常にギルティ
  60. 60. さてさて、 バージョニング問題 理解してもらえましたか?
  61. 61. みんなバージョニング問題を 引き起こしそうなライブラリ 作っちゃいけませんよ!
  62. 62. 約束な!
  63. 63. Javaのバージョニング問題の話しよっか   室星亮太 2016/01/21(木)(第1回(ゆるゆる高専エンジニアLT大会(at(FULLER

×