SlideShare a Scribd company logo
1 of 68
Download to read offline
Javaのバージョニング問題
の話しよっか
室星亮太
2016/01/21(木)(第1回(ゆるゆる高専エンジニアLT大会(at(FULLER
突然ですが問題です
このクラスを含むライブラリがあります(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 = "ぴよぴよ!";
}
さっきのライブラリに依存するライブラリがあります(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);
}
}
こんな感じで使います
package com.mrstar;
import com.mrstar.versioning_problem.framework.Framework;
public class Main {
public static void main(String[] args) {
Framework.showTitle();
Framework.showMessage();
}
}
実行すると...
package com.mrstar;
import com.mrstar.versioning_problem.framework.Framework;
public class Main {
public static void main(String[] args) {
Framework.showTitle(); // 「ほげふが」って表示される
Framework.showMessage(); // 「ぴよぴよ!」って表示される
}
}
こっからがポイントです
もうちょっと状況説明が続きます
仮の文言を本番用に変更し、バージョンアップ(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 = "こんにちは!";
}
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 なんて表示される?
}
}
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.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);
}
}
これをコンパイルした結果がポイント!
framework.jarの中身をデコンパイルすると...
デコンパイルした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("ぴよぴよ!");
}
}
気づいた?
もう一回みてみましょう!
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);
}
}
デコンパイルした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("ぴよぴよ!");
}
}
おわかりいただけましたか?
デコンパイルした.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+(JavaScriptむずいね)
「バージョニング問題、稀なケースなんでしょ?」
わたしもそう思っていた時期がありました。
去年遭遇しました
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) {
super.onCreate(savedInstanceState);
// これ!!!ビルドすると整数リテラルに
setContentView(R.layout.activity_main);
}
}
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

More Related Content

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

第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」
yoshiaki iwanaga
 
クラスローダーについて
クラスローダーについてクラスローダーについて
クラスローダーについて
Suguru ARAKAWA
 
Javaセキュアコーディングセミナー東京第3回講義
Javaセキュアコーディングセミナー東京第3回講義Javaセキュアコーディングセミナー東京第3回講義
Javaセキュアコーディングセミナー東京第3回講義
JPCERT Coordination Center
 
第2回デザインパターン資料
第2回デザインパターン資料第2回デザインパターン資料
第2回デザインパターン資料
gaaupp
 
明日から使える Java SE 7
明日から使える Java SE 7明日から使える Java SE 7
明日から使える Java SE 7
Yuichi Sakuraba
 

Similar to Javaのバージョニング問題の話しよっか (16)

JavaOne2015報告会 Java EE アップデート #j1jp
JavaOne2015報告会 Java EE アップデート #j1jpJavaOne2015報告会 Java EE アップデート #j1jp
JavaOne2015報告会 Java EE アップデート #j1jp
 
JavaScript (ECMAScript) 2013
JavaScript (ECMAScript) 2013JavaScript (ECMAScript) 2013
JavaScript (ECMAScript) 2013
 
gen-class とバイトコード(第3回 gen-class 勉強会資料)
gen-class とバイトコード(第3回 gen-class 勉強会資料)gen-class とバイトコード(第3回 gen-class 勉強会資料)
gen-class とバイトコード(第3回 gen-class 勉強会資料)
 
Apache Torqueについて
Apache TorqueについてApache Torqueについて
Apache Torqueについて
 
Spring AMQP × RabbitMQ
Spring AMQP × RabbitMQSpring AMQP × RabbitMQ
Spring AMQP × RabbitMQ
 
第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」
 
FlexUnit4とMockitoFlex
FlexUnit4とMockitoFlexFlexUnit4とMockitoFlex
FlexUnit4とMockitoFlex
 
クラスローダーについて
クラスローダーについてクラスローダーについて
クラスローダーについて
 
Javaセキュアコーディングセミナー東京第3回講義
Javaセキュアコーディングセミナー東京第3回講義Javaセキュアコーディングセミナー東京第3回講義
Javaセキュアコーディングセミナー東京第3回講義
 
jjugccc2018 app review postmortem
jjugccc2018 app review postmortemjjugccc2018 app review postmortem
jjugccc2018 app review postmortem
 
JavaScript.Next
JavaScript.NextJavaScript.Next
JavaScript.Next
 
第2回デザインパターン資料
第2回デザインパターン資料第2回デザインパターン資料
第2回デザインパターン資料
 
明日から使える Java SE 7
明日から使える Java SE 7明日から使える Java SE 7
明日から使える Java SE 7
 
Xtend - Javaの未来を今すぐ使う
Xtend - Javaの未来を今すぐ使うXtend - Javaの未来を今すぐ使う
Xtend - Javaの未来を今すぐ使う
 
JDK 13 New Features [MeetUp with Java Experts! @Gaienmae/Dojima 2019]
JDK 13 New Features [MeetUp with Java Experts! @Gaienmae/Dojima 2019]JDK 13 New Features [MeetUp with Java Experts! @Gaienmae/Dojima 2019]
JDK 13 New Features [MeetUp with Java Experts! @Gaienmae/Dojima 2019]
 
実行可能JavaFXアプリケーションJAR(発表直前版)
実行可能JavaFXアプリケーションJAR(発表直前版)実行可能JavaFXアプリケーションJAR(発表直前版)
実行可能JavaFXアプリケーションJAR(発表直前版)
 

More from Ryota Murohoshi

More from Ryota Murohoshi (17)

UnityでC#6.0が使える未来がそろそろ来そう!
UnityでC#6.0が使える未来がそろそろ来そう!UnityでC#6.0が使える未来がそろそろ来そう!
UnityでC#6.0が使える未来がそろそろ来そう!
 
【Unity】気づいたら加わっていたあいつ【もくもく】
【Unity】気づいたら加わっていたあいつ【もくもく】【Unity】気づいたら加わっていたあいつ【もくもく】
【Unity】気づいたら加わっていたあいつ【もくもく】
 
【ハピバ】未来に備えたKotlin、大好きだぜ!【Kotlin 1.0】
【ハピバ】未来に備えたKotlin、大好きだぜ!【Kotlin 1.0】【ハピバ】未来に備えたKotlin、大好きだぜ!【Kotlin 1.0】
【ハピバ】未来に備えたKotlin、大好きだぜ!【Kotlin 1.0】
 
LINQ、Select連弾ってやります?
LINQ、Select連弾ってやります?LINQ、Select連弾ってやります?
LINQ、Select連弾ってやります?
 
C#のList_TがIListを実装している件
C#のList_TがIListを実装している件C#のList_TがIListを実装している件
C#のList_TがIListを実装している件
 
どうしてこのコードエラーになるんですか?
どうしてこのコードエラーになるんですか?どうしてこのコードエラーになるんですか?
どうしてこのコードエラーになるんですか?
 
広告ネイティブプラグインの辛かった話しよっか
広告ネイティブプラグインの辛かった話しよっか広告ネイティブプラグインの辛かった話しよっか
広告ネイティブプラグインの辛かった話しよっか
 
UnityでC#を勉強しはじめた私の主張
UnityでC#を勉強しはじめた私の主張UnityでC#を勉強しはじめた私の主張
UnityでC#を勉強しはじめた私の主張
 
普段C#を使っている僕から見たKotlin
普段C#を使っている僕から見たKotlin普段C#を使っている僕から見たKotlin
普段C#を使っている僕から見たKotlin
 
T4使ってみた
T4使ってみたT4使ってみた
T4使ってみた
 
UnityでのLINQ活用例
UnityでのLINQ活用例UnityでのLINQ活用例
UnityでのLINQ活用例
 
私とUnityとLINQと
私とUnityとLINQと私とUnityとLINQと
私とUnityとLINQと
 
「LINQ」っていう名前だけでも 覚えて帰ってください!
「LINQ」っていう名前だけでも 覚えて帰ってください!「LINQ」っていう名前だけでも 覚えて帰ってください!
「LINQ」っていう名前だけでも 覚えて帰ってください!
 
JXUGのLTだけれどもUnity+iOS+LINQの話をしようと思う!
JXUGのLTだけれどもUnity+iOS+LINQの話をしようと思う!JXUGのLTだけれどもUnity+iOS+LINQの話をしようと思う!
JXUGのLTだけれどもUnity+iOS+LINQの話をしようと思う!
 
RxJava初心者の私が良いと思ったやり方、素敵だと思った資料など
RxJava初心者の私が良いと思ったやり方、素敵だと思った資料などRxJava初心者の私が良いと思ったやり方、素敵だと思った資料など
RxJava初心者の私が良いと思ったやり方、素敵だと思った資料など
 
共変戻り値型って知ってますか?
共変戻り値型って知ってますか?共変戻り値型って知ってますか?
共変戻り値型って知ってますか?
 
明日からちょっと KotlinでAndroidが書きたくなる(かもしれない?)SAM変換と拡張関数
明日からちょっと KotlinでAndroidが書きたくなる(かもしれない?)SAM変換と拡張関数明日からちょっと KotlinでAndroidが書きたくなる(かもしれない?)SAM変換と拡張関数
明日からちょっと KotlinでAndroidが書きたくなる(かもしれない?)SAM変換と拡張関数
 

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