Submit Search
Upload
Javaのバージョニング問題の話しよっか
•
0 likes
•
1,584 views
Ryota Murohoshi
Follow
2016/01/21(木)に行われた第1回ゆるゆる高専エンジニアLT大会 at FULLER の発表資料です。
Read less
Read more
Technology
Report
Share
Report
Share
1 of 68
Download now
Download to read offline
Recommended
Java 7
Java 7
Tetsuya Yoshida
Beginning java ee 6 13章メッセージ通信up
Beginning java ee 6 13章メッセージ通信up
zuisener .
Beginning Java EE 6 勉強会(5) #bje_study
Beginning Java EE 6 勉強会(5) #bje_study
zuisener .
Beginning java ee 6 13章メッセージ通信
Beginning java ee 6 13章メッセージ通信
zuisener .
Solr meeting in Japan 2011
Solr meeting in Japan 2011
Takahiko Ito
ClassLoader Leak Patterns
ClassLoader Leak Patterns
nekop
DBスキーマもバージョン管理したい!
DBスキーマもバージョン管理したい!
kwatch
「var禁止」禁止
「var禁止」禁止
Ryota Murohoshi
Recommended
Java 7
Java 7
Tetsuya Yoshida
Beginning java ee 6 13章メッセージ通信up
Beginning java ee 6 13章メッセージ通信up
zuisener .
Beginning Java EE 6 勉強会(5) #bje_study
Beginning Java EE 6 勉強会(5) #bje_study
zuisener .
Beginning java ee 6 13章メッセージ通信
Beginning java ee 6 13章メッセージ通信
zuisener .
Solr meeting in Japan 2011
Solr meeting in Japan 2011
Takahiko Ito
ClassLoader Leak Patterns
ClassLoader Leak Patterns
nekop
DBスキーマもバージョン管理したい!
DBスキーマもバージョン管理したい!
kwatch
「var禁止」禁止
「var禁止」禁止
Ryota Murohoshi
JavaOne2015報告会 Java EE アップデート #j1jp
JavaOne2015報告会 Java EE アップデート #j1jp
Norito Agetsuma
JavaScript (ECMAScript) 2013
JavaScript (ECMAScript) 2013
dynamis
gen-class とバイトコード(第3回 gen-class 勉強会資料)
gen-class とバイトコード(第3回 gen-class 勉強会資料)
tnoda
Apache Torqueについて
Apache Torqueについて
tako pons
Spring AMQP × RabbitMQ
Spring AMQP × RabbitMQ
Keisuke Nishitani
第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」
yoshiaki iwanaga
FlexUnit4とMockitoFlex
FlexUnit4とMockitoFlex
Yasuhiro Morikawa
クラスローダーについて
クラスローダーについて
Suguru ARAKAWA
Javaセキュアコーディングセミナー東京第3回講義
Javaセキュアコーディングセミナー東京第3回講義
JPCERT Coordination Center
jjugccc2018 app review postmortem
jjugccc2018 app review postmortem
tamtam180
JavaScript.Next
JavaScript.Next
dynamis
第2回デザインパターン資料
第2回デザインパターン資料
gaaupp
明日から使える Java SE 7
明日から使える Java SE 7
Yuichi Sakuraba
Xtend - Javaの未来を今すぐ使う
Xtend - Javaの未来を今すぐ使う
Tatsumi Naganuma
JDK 13 New Features [MeetUp with Java Experts! @Gaienmae/Dojima 2019]
JDK 13 New Features [MeetUp with Java Experts! @Gaienmae/Dojima 2019]
David Buck
実行可能JavaFXアプリケーションJAR(発表直前版)
実行可能JavaFXアプリケーションJAR(発表直前版)
torutk
UnityでC#6.0が使える未来がそろそろ来そう!
UnityでC#6.0が使える未来がそろそろ来そう!
Ryota Murohoshi
【Unity】気づいたら加わっていたあいつ【もくもく】
【Unity】気づいたら加わっていたあいつ【もくもく】
Ryota Murohoshi
【ハピバ】未来に備えたKotlin、大好きだぜ!【Kotlin 1.0】
【ハピバ】未来に備えたKotlin、大好きだぜ!【Kotlin 1.0】
Ryota Murohoshi
LINQ、Select連弾ってやります?
LINQ、Select連弾ってやります?
Ryota Murohoshi
C#のList_TがIListを実装している件
C#のList_TがIListを実装している件
Ryota Murohoshi
どうしてこのコードエラーになるんですか?
どうしてこのコードエラーになるんですか?
Ryota Murohoshi
More Related Content
Similar to Javaのバージョニング問題の話しよっか
JavaOne2015報告会 Java EE アップデート #j1jp
JavaOne2015報告会 Java EE アップデート #j1jp
Norito Agetsuma
JavaScript (ECMAScript) 2013
JavaScript (ECMAScript) 2013
dynamis
gen-class とバイトコード(第3回 gen-class 勉強会資料)
gen-class とバイトコード(第3回 gen-class 勉強会資料)
tnoda
Apache Torqueについて
Apache Torqueについて
tako pons
Spring AMQP × RabbitMQ
Spring AMQP × RabbitMQ
Keisuke Nishitani
第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」
yoshiaki iwanaga
FlexUnit4とMockitoFlex
FlexUnit4とMockitoFlex
Yasuhiro Morikawa
クラスローダーについて
クラスローダーについて
Suguru ARAKAWA
Javaセキュアコーディングセミナー東京第3回講義
Javaセキュアコーディングセミナー東京第3回講義
JPCERT Coordination Center
jjugccc2018 app review postmortem
jjugccc2018 app review postmortem
tamtam180
JavaScript.Next
JavaScript.Next
dynamis
第2回デザインパターン資料
第2回デザインパターン資料
gaaupp
明日から使える Java SE 7
明日から使える Java SE 7
Yuichi Sakuraba
Xtend - Javaの未来を今すぐ使う
Xtend - Javaの未来を今すぐ使う
Tatsumi Naganuma
JDK 13 New Features [MeetUp with Java Experts! @Gaienmae/Dojima 2019]
JDK 13 New Features [MeetUp with Java Experts! @Gaienmae/Dojima 2019]
David Buck
実行可能JavaFXアプリケーションJAR(発表直前版)
実行可能JavaFXアプリケーションJAR(発表直前版)
torutk
Similar to Javaのバージョニング問題の話しよっか
(16)
JavaOne2015報告会 Java EE アップデート #j1jp
JavaOne2015報告会 Java EE アップデート #j1jp
JavaScript (ECMAScript) 2013
JavaScript (ECMAScript) 2013
gen-class とバイトコード(第3回 gen-class 勉強会資料)
gen-class とバイトコード(第3回 gen-class 勉強会資料)
Apache Torqueについて
Apache Torqueについて
Spring AMQP × RabbitMQ
Spring AMQP × RabbitMQ
第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」
FlexUnit4とMockitoFlex
FlexUnit4とMockitoFlex
クラスローダーについて
クラスローダーについて
Javaセキュアコーディングセミナー東京第3回講義
Javaセキュアコーディングセミナー東京第3回講義
jjugccc2018 app review postmortem
jjugccc2018 app review postmortem
JavaScript.Next
JavaScript.Next
第2回デザインパターン資料
第2回デザインパターン資料
明日から使える Java SE 7
明日から使える Java SE 7
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]
実行可能JavaFXアプリケーションJAR(発表直前版)
実行可能JavaFXアプリケーションJAR(発表直前版)
More from Ryota Murohoshi
UnityでC#6.0が使える未来がそろそろ来そう!
UnityでC#6.0が使える未来がそろそろ来そう!
Ryota Murohoshi
【Unity】気づいたら加わっていたあいつ【もくもく】
【Unity】気づいたら加わっていたあいつ【もくもく】
Ryota Murohoshi
【ハピバ】未来に備えたKotlin、大好きだぜ!【Kotlin 1.0】
【ハピバ】未来に備えたKotlin、大好きだぜ!【Kotlin 1.0】
Ryota Murohoshi
LINQ、Select連弾ってやります?
LINQ、Select連弾ってやります?
Ryota Murohoshi
C#のList_TがIListを実装している件
C#のList_TがIListを実装している件
Ryota Murohoshi
どうしてこのコードエラーになるんですか?
どうしてこのコードエラーになるんですか?
Ryota Murohoshi
広告ネイティブプラグインの辛かった話しよっか
広告ネイティブプラグインの辛かった話しよっか
Ryota Murohoshi
UnityでC#を勉強しはじめた私の主張
UnityでC#を勉強しはじめた私の主張
Ryota Murohoshi
普段C#を使っている僕から見たKotlin
普段C#を使っている僕から見たKotlin
Ryota Murohoshi
T4使ってみた
T4使ってみた
Ryota Murohoshi
UnityでのLINQ活用例
UnityでのLINQ活用例
Ryota Murohoshi
私とUnityとLINQと
私とUnityとLINQと
Ryota Murohoshi
「LINQ」っていう名前だけでも 覚えて帰ってください!
「LINQ」っていう名前だけでも 覚えて帰ってください!
Ryota Murohoshi
JXUGのLTだけれどもUnity+iOS+LINQの話をしようと思う!
JXUGのLTだけれどもUnity+iOS+LINQの話をしようと思う!
Ryota Murohoshi
RxJava初心者の私が良いと思ったやり方、素敵だと思った資料など
RxJava初心者の私が良いと思ったやり方、素敵だと思った資料など
Ryota Murohoshi
共変戻り値型って知ってますか?
共変戻り値型って知ってますか?
Ryota Murohoshi
明日からちょっと KotlinでAndroidが書きたくなる(かもしれない?)SAM変換と拡張関数
明日からちょっと KotlinでAndroidが書きたくなる(かもしれない?)SAM変換と拡張関数
Ryota Murohoshi
More from Ryota Murohoshi
(17)
UnityでC#6.0が使える未来がそろそろ来そう!
UnityでC#6.0が使える未来がそろそろ来そう!
【Unity】気づいたら加わっていたあいつ【もくもく】
【Unity】気づいたら加わっていたあいつ【もくもく】
【ハピバ】未来に備えたKotlin、大好きだぜ!【Kotlin 1.0】
【ハピバ】未来に備えたKotlin、大好きだぜ!【Kotlin 1.0】
LINQ、Select連弾ってやります?
LINQ、Select連弾ってやります?
C#のList_TがIListを実装している件
C#のList_TがIListを実装している件
どうしてこのコードエラーになるんですか?
どうしてこのコードエラーになるんですか?
広告ネイティブプラグインの辛かった話しよっか
広告ネイティブプラグインの辛かった話しよっか
UnityでC#を勉強しはじめた私の主張
UnityでC#を勉強しはじめた私の主張
普段C#を使っている僕から見たKotlin
普段C#を使っている僕から見たKotlin
T4使ってみた
T4使ってみた
UnityでのLINQ活用例
UnityでのLINQ活用例
私とUnityとLINQと
私とUnityとLINQと
「LINQ」っていう名前だけでも 覚えて帰ってください!
「LINQ」っていう名前だけでも 覚えて帰ってください!
JXUGのLTだけれどもUnity+iOS+LINQの話をしようと思う!
JXUGのLTだけれどもUnity+iOS+LINQの話をしようと思う!
RxJava初心者の私が良いと思ったやり方、素敵だと思った資料など
RxJava初心者の私が良いと思ったやり方、素敵だと思った資料など
共変戻り値型って知ってますか?
共変戻り値型って知ってますか?
明日からちょっと KotlinでAndroidが書きたくなる(かもしれない?)SAM変換と拡張関数
明日からちょっと KotlinでAndroidが書きたくなる(かもしれない?)SAM変換と拡張関数
Recently uploaded
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
iPride Co., Ltd.
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
Hiroshi Tomioka
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
atsushi061452
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
CRI Japan, Inc.
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
CRI Japan, Inc.
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
Toru Tamaki
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
Toru Tamaki
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
iPride Co., Ltd.
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NTT DATA Technology & Innovation
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Hiroshi Tomioka
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
iPride Co., Ltd.
Recently uploaded
(11)
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Javaのバージョニング問題の話しよっか
1.
Javaのバージョニング問題 の話しよっか 室星亮太 2016/01/21(木)(第1回(ゆるゆる高専エンジニアLT大会(at(FULLER
2.
突然ですが問題です
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.
さっきのライブラリに依存するライブラリがあります(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.
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.
実行すると... package com.mrstar; import com.mrstar.versioning_problem.framework.Framework; public
class Main { public static void main(String[] args) { Framework.showTitle(); // 「ほげふが」って表示される Framework.showMessage(); // 「ぴよぴよ!」って表示される } }
8.
こっからがポイントです もうちょっと状況説明が続きます
9.
仮の文言を本番用に変更し、バージョンアップ(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 = "こんにちは!"; }
10.
11.
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 なんて表示される? } }
12.
Q1#「Framework.showTitle();」 • 「ほげふが」って表示されると思う人? • 「メインページ」って表示されると思う人?
13.
Q2#「Framework.showMessage();」 • 「ぴよぴよ!」って表示されると思う人? • 「こんにちは!」って表示されると思う人?
14.
答え合わせ!
15.
Q1#Framework.showTitle()は 「メインページ」って表示されます Q2#Framework.showMessage()は 「ぴよぴよ!」って表示されます
16.
あってた?
17.
解説!
18.
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); } }
19.
これをコンパイルした結果がポイント! framework.jarの中身をデコンパイルすると...
20.
デコンパイルした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("ぴよぴよ!"); } }
21.
気づいた? もう一回みてみましょう!
22.
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); } }
23.
デコンパイルした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("ぴよぴよ!"); } }
24.
おわかりいただけましたか?
25.
デコンパイルした.class Core.MESSAGEの文字列リテラルの「ぴよぴよ」 直接埋め込まれていましたね!
26.
Core.MESSAGEの文字列リテラル、 直接埋め込まれていましたね!
27.
public'sta+c'final'String'MESSAGE'(略) 直接埋め込まれていましたね!
28.
バージョニング問題! 用語自体はC#のもの
29.
public'sta+c'final'intやpublic'sta+c'final'String 等クラス定数の箇所はコンパイルすると 数値・文字列リテラルに展開されます!
30.
framework.jarは core_v1.jarに依存しビルドしました その後、再ビルドしませんでしたね
31.
framework.jarを再ビルドするまで、Framewarkクラス内の Coreクラスの定数Core.MESSAGEを使っている箇所は core_v1の「ぴよぴよ」のままです
32.
想像してください! 製品版のプログラムでテスト用の文言が出てきてしまうのを!
33.
((((;゚Д゚))))
34.
まぁぶっちゃけ ピヨピヨ とか、かわいいもんだよね(汗)
35.
「ここに射幸心をジャブジャブ る文言」 笑えないね
36.
ポイントおさらい public'sta+c'final'intみたいな定数は コンパイルするとリテラルとして展開される ※プリミティブ型とString型
37.
「framework.jar再ビルドすりゃよくね?」 まぁそうなんだけど、Java書くならこれは知っといてほしい 定数が埋め込まれて思わぬバグの原因になるから!
38.
遅くなりましたが自己紹介 • 室星亮太 • 最初はJavaでAndroid+(2016年でもJava6+orz) •
最近までC#でUnity+(2016年でもC#3.0(一部4.0)+orz) • 今はTypeScriptでNode.js+(JavaScriptむずいね)
39.
「バージョニング問題、稀なケースなんでしょ?」
40.
わたしもそう思っていた時期がありました。
41.
去年遭遇しました Unity&+&Android&+&ある広告SDKで
42.
またまた問題です! 今度はAndroid経験者が対象
43.
Androidでpublic,sta0c,final,int なよく使うやつってな∼んだ!?
44.
Rクラス
45.
R.layout.activity_mainのようなリソースID レイアウトや画像に振られるリソースID(intな定数) Rクラスのパッケージ名はアプリのパッケージ名に
46.
RクラスのリソースID利用例 public class MainActivity
extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // これ!!!ビルドすると整数リテラルに setContentView(R.layout.activity_main); } }
47.
Unity&+&Android&+&ある広告SDKで バージョニング問題が原因の不具合に遭遇!
48.
Unity+Android+ある広告SDKの構成例 これはUnity4までのやり方で現在は非推奨
49.
50.
レイアウトのXMLや画像などのリソース 上記リソースを使う広告表示機能のjar (AndroidManifest.xml)
51.
jarの中のクラスでは、R.layout.activity_main みたいなリソースIDの定数、リテラルとして展開されてるよね!
52.
Unityはビルド時、Androidのアプリを作るため 新たにAndroidプロジェクトを作って このタイミングでリソースに再度リソースIDが振られます
53.
54.
jarの中のクラスでは、R.layout.activity_main みたいなリソースIDの定数、リテラルとして展開されてるよね!
55.
もし
56.
プラグインが二つになったら
57.
58.
プラグインが二つになったら
59.
この状態でAndroidプロジェクトを作り リソースIDを振り直したら
60.
プラグインのJarの中の整数リテラルと Unityが新たに作るリソースIDの整数が ずれる!
61.
実行時エラー!
62.
タチが悪い
63.
public'sta+c'final'intがベタ書きされた jarを作ったSDK開発者が悪い! jarの中のリソースIDとUnityが作るAndroidプロジェクトのリソースIDとが一致しない!
64.
最悪、非常にギルティ
65.
さてさて、 バージョニング問題 理解してもらえましたか?
66.
みんなバージョニング問題を 引き起こしそうなライブラリ 作っちゃいけませんよ!
67.
約束な!
68.
Javaのバージョニング問題の話しよっか 室星亮太 2016/01/21(木)(第1回(ゆるゆる高専エンジニアLT大会(at(FULLER
Download now