1幎åã MavenãšRetrolambdaã䜿çšããŠãJava 8èšèªããŒã«ãšé¢é£ãããJava 8ã§ã¯ãªããã©ã€ãã©ãªã䜿çšããŠã¢ããªã±ãŒã·ã§ã³ãAndroidã«ç§»æ€ããæ¹æ³ã«ã€ããŠèª¬æããŸããã æ®å¿µãªãããæ°ããJava 8 APIã¯ãå€ãã¿ãŒã²ãããã©ãããã©ãŒã äžã«ååšããªãããã䜿çšã§ããŸããã ããããã¢ã€ãã¢èªäœã¯ç§ãé·ãéæŸçœ®ããŠããªãã£ãã®ã§ãããšãã°ãStream APIãå€ããã©ãããã©ãŒã ã«ç§»æ€ããã©ã ãåŒã®ãããªèšèªã®æ©èœã«å¶éãããªãããã«ããããšã¯å¯èœã ããããšæããŸããã
æçµçã«ããã®ã¢ã€ãã¢ã¯æ¬¡ã®ããšãæå³ããŸãïŒåã®ã±ãŒã¹ã®ããã«ãå©çšå¯èœãªããŒã«ãç¹ã«å€ãè¯ãRetrolambdaã䜿çšããŠStream APIãã€ãã³ãŒããæžãæãããã®APIã䜿çšããã³ãŒããJavaã®å€ãããŒãžã§ã³ã§åäœã§ããããã«ããå¿
èŠããããŸãã ãªãJava 6ãªã®ãïŒ æ£çŽãªãšãããç§ã¯ãã®ããŒãžã§ã³ã®Javaã§ããé·ãäœæ¥ããŸããããJava 5ã¯èŠã€ãããŸããã§ãããç§ã«ãšã£ãŠJava 7ã¯ãŸãã§ç©ºãé£ã¶ãããªãã®ã§ããã
ãŸãããã®èšäºã§èª¬æãããã¹ãŠã®æ瀺ã¯çŽç²ã«å®éšçãªãã®ã§ãããå®çšçã§ã¯ãªãããšãç¹°ãè¿ããŸãã ãŸã第äžã«ãããŒãã¯ã©ã¹ããŒããŒã䜿çšããå¿
èŠããããšããäºå®ã®ããã«ãããã¯åžžã«åãå
¥ããããããã§ãããŸã£ããå¯èœã§ããããã§ããããŸããã ãããŠç¬¬äºã«ããã®ã¢ã€ãã¢ã®å®è£
ãã®ãã®ã¯ççŽã«èšã£ãŠæ¹¿æ°ããããå€ãã®äžäŸ¿ããããæãããªèœãšãç©Žã¯ãããŸããã
ããŒã«
ãã®ãããå¿
èŠãªããŒã«ã®ã»ããã¯ã次ã®ã¡ã€ã³ããã±ãŒãžã§è¡šãããŸãã
å®éšã«é¢ä¿ããé¢é£ããŒã«ïŒ
å€ãããŒãžã§ã³ã®OpenJDKã«å ããŠã移æ€äŸã¯Mavenã§ã¯ãªãAntã䜿çšããŠè¡ãããŸãã ç§ã¯èšå®ã«é¢ããèŠçŽã®æ¯æè
ã§ãããAntã5ã6幎䜿çšããŠããŸããããAntã¯ãã®ç¹å®ã®ã¿ã¹ã¯ã解決ããããã®ã¯ããã«äŸ¿å©ãªããŒã«ã§ãããšæãããŸãã ãŸã第äžã«ãã·ã³ãã«ãã®ããããããŠå®éã«ã¯ãMavenãé床ãããã³ã¯ãã¹ãã©ãããã©ãŒã ã§éæããã®ãé£ãã埮調æŽã®ããïŒã·ã§ã«ã¹ã¯ãªããã¯ããã«çããªããŸãããCygwinããã³åæ§ã®ããŒã·ã§ã³ïŒã
Stream APIã®ç°¡åãªäŸããæŠå¿µå®èšŒãšããŠäœ¿çšããŸãã
package test; import java.util.stream.Stream; import static java.lang.System.out; public final class EntryPoint { private EntryPoint() { } public static void main(final String... args) { runAs("stream", () -> Stream.of(args).map(String::toUpperCase).forEach(EntryPoint::dump)); } private static void runAs(final String name, final Runnable runnable) { out.println("pre: " + name); runnable.run(); out.println("post: " + name); } private static void dump(final Object o) { out.println(">" + o); } }
å®éšãã©ã®ããã«é²ããã«ã€ããŠã®ããã€ãã®èšèã Antã®build.xml
å€ãã®ã¹ãããã«åå²ãããåã¹ãããã«ã¯ç§»æ€ããã»ã¹äžã«ç¬èªã®ãã£ã¬ã¯ããªãå²ãåœãŠãããŸãã ããã«ãããå°ãªããšãç§ã«ãšã£ãŠã¯ããœãªã¥ãŒã·ã§ã³ãèŠã€ããŠãããã°ããããã»ã¹ã倧å¹
ã«ç°¡çŽ åãããã¹ãããããšã®å€æŽã远跡ã§ããŸãã
移æ€ããã»ã¹
ã¹ããã0ãåæå
ãã€ãã®ããã«ãAntã§æåã«è¡ãããšã¯ã»ãšãã©åžžã«ã¿ãŒã²ãããã£ã¬ã¯ããªãäœæããããšã§ãã
<target name="init" description="Initializes the workspace"> <mkdir dir="${targetDir}"/> </target>
ã¹ããã1.ã°ã©ã
å®éšã®éåžžã«éèŠãªèŠçŽ ã¯ããã¹ãã±ãŒã¹ãäŸåãããã¹ãŠã®ã¯ã©ã¹ã®æå°ã®æ£ç¢ºãªãªã¹ãã§ãã æ®å¿µãªãããããããã£ãšç°¡åã«ã§ãããã©ããããããŸãããç¹°ãè¿ãå®è¡ã®æ¹æ³ã䜿çšããŠãJRE 8ããå¿
èŠãªãã¹ãŠã®ã¯ã©ã¹ãç»é²ããã®ã«ããªãã®æéãè²»ãããŸããã
äžæ¹ã java.util.stream
ããã±ãŒãžå
šäœããã«ããŠãããä»ã®äŸåé¢ä¿ããã«ããããã«ããã«æéãè²»ããããšïŒãããŠãããããProGuardãªã©ã®ããŒã«ã§åŠçããããšïŒãè©Šã¿ãã®ã¯çã«ããªã£ãŠããŸãã ããããç§ã¯å¥ã®ç°¡åãªããªãã¯ãéžã¶ããšã«ããŸããã $**
ãã¹ã¯ã䜿çšããŠããã¹ããããã¯ã©ã¹ãšå
éšã¯ã©ã¹ãåçŽã«ã³ããŒããŸãã ããã«ãããæéãšãªã¹ãã倧å¹
ã«ç¯çŽãããŸãã Java 8ã§æ°ããæ©èœãè¿œå ããããããJavaã®å€ãããŒãžã§ã³ã«ååšããŠããããã€ãã®ã¯ã©ã¹ãåæ§ã«ã³ããŒããå¿
èŠããããŸãã ããã¯ãããšãã°ãæ°ããããã©ã«ãMap.putIfAbsent(Object,Object)
ã«é©çšãããŸããããã¯ããã¹ãã«ã¯é¢ä¿ããŸããããæ£ããæäœã«å¿
èŠã§ãã
<target name="01-grab" depends="init" description="Step 01: Grab some JRE 8 classes"> <unzip src="${java.home}/lib/rt.jar" dest="${step01TargetDir}"> <patternset> <include name="java/lang/AutoCloseable.class"/> <include name="java/lang/Iterable.class"/> <include name="java/util/Arrays.class"/> <include name="java/util/AbstractMap.class"/> <include name="java/util/EnumMap.class"/> <include name="java/util/EnumMap$**.class"/> <include name="java/util/function/Consumer.class"/> <include name="java/util/function/Function.class"/> <include name="java/util/function/Supplier.class"/> <include name="java/util/Iterator.class"/> <include name="java/util/Map.class"/> <include name="java/util/Objects.class"/> <include name="java/util/Spliterator.class"/> <include name="java/util/Spliterator$**.class"/> <include name="java/util/Spliterators.class"/> <include name="java/util/Spliterators$**.class"/> <include name="java/util/stream/AbstractPipeline.class"/> <include name="java/util/stream/BaseStream.class"/> <include name="java/util/stream/ForEachOps.class"/> <include name="java/util/stream/ForEachOps$**.class"/> <include name="java/util/stream/PipelineHelper.class"/> <include name="java/util/stream/ReferencePipeline.class"/> <include name="java/util/stream/ReferencePipeline$**.class"/> <include name="java/util/stream/Sink.class"/> <include name="java/util/stream/Sink$**.class"/> <include name="java/util/stream/Stream.class"/> <include name="java/util/stream/StreamShape.class"/> <include name="java/util/stream/StreamOpFlag.class"/> <include name="java/util/stream/StreamOpFlag$**.class"/> <include name="java/util/stream/StreamSupport.class"/> <include name="java/util/stream/TerminalSink.class"/> <include name="java/util/stream/TerminalOp.class"/> </patternset> </unzip> </target>
å®éãéåžžã«å°è±¡çãªã¯ã©ã¹ã®ãªã¹ãã¯ãæåã¯map()
ããã³forEach()
ããã«åçŽãªå Žåã«ã®ã¿å¿
èŠã§ãã
ã¹ããã2.ã³ã³ãã€ã«
éå±ãªãã¹ãã³ãŒãã®ã³ã³ãã€ã«ã ã©ããç°¡åã§ãã
<target name="02-compile" depends="01-grab" description="Step 02: Compiles the source code dependent on the grabbed JRE 8 classes"> <mkdir dir="${step02TargetDir}"/> <javac srcdir="${srcDir}" destdir="${step02TargetDir}" source="1.8" target="1.8"/> </target>
ã¹ããã3.ããŒãž
ãã®æé ã¯ãJava 8 rt.jar
ããã¯ã©ã¹ãã³ããŒããçµæãšãã¹ãã±ãŒã¹ãããŒãžããã ããªã®ã§ãå°ãå¥åŠã«èŠãããããããŸããã ããã¯ã次ã®ããã€ãã®ã¹ãããã§å®éã«å¿
èŠã«ãªããé©åãªåŸåŠçã®ããã«Javaããã±ãŒãžã移åããŸãã
<target name="03-merge" depends="02-compile" description="Step 03: Merge into a single JAR in order to relocate Java 8 packages properly"> <zip basedir="${step01TargetDir}" destfile="${step03TargetFile}"/> <zip basedir="${step02TargetDir}" destfile="${step03TargetFile}" update="true"/> </target>
ã¹ããã4.ã·ã§ãŒã
Mavenã«ã¯ãã¯ã©ã¹ãã¡ã€ã«ã®ãã€ãã³ãŒããçŽæ¥å€æŽããŠãã±ããã移åã§ããèå³æ·±ããã©ã°ã€ã³ããããŸãã ç§ã¯ç¥ããªããããããŸããããAntã«ãŠã³ã¿ãŒããŒããååšãããã©ããã€ã³ã¿ãŒãããã§èŠæ ããæªããããããŸããããAnt ã®å°ããªæ¡åŒµæ©èœãæžããããããŸããã§ãããããã¯ãMavenãã©ã°ã€ã³çšã®ã·ã³ãã«ãªã¢ããã¿ãŒã§ãã maven-shade-plugin
ä»ã®æ©èœmaven-shade-plugin
ãŸããã
ãã®æ®µéã§ãRetrolambdaãããã«äœ¿çšã§ããããã«ããã«ã¯ããã¹ãŠã®java.*
ããã±ãŒãžãã.javaã®ãããªååã«å€æŽããå¿
èŠããã~.java.*
ïŒã¯ãããã«ãã§ã-ãªãã§ããïŒïŒã å®éã®ãšãããRetrolambdaã¯java.lang.invoke.MethodHandles
ã¯ã©ã¹ã®äœæ¥ã«äŸåããŠããããã java.*
ïŒããã³sun.*
ããã±ãŒãžã¯Oracle JDK / JREã®ããã«ïŒã®äœ¿çšãçŠæ¢ãããŠããŸãã ãããã£ãŠãäžæçã«ããã±ãŒãžã移åããããšã¯ãåã«java.lang.invoke.MethodHandles
ãããã©ã€ã³ããããæ¹æ³ã§ãã
ã¹ããã1ã®ããã«ãã€ã³ã¯ã«ãŒããªã¹ããä»ããŠã¯ã©ã¹ã®å®å
šãªãªã¹ããåå¥ã«æå®ããå¿
èŠããããŸããã ãããè¡ããã«ãªã¹ããå®å
šã«çç¥ãããšãã¯ã©ã¹ãã¡ã€ã«å
ã®shade
ã¯ãåŠçãããäºå®ã®ãªãã¯ã©ã¹ã移åããŸãã ãã®å Žåãããšãã°ã java.lang.String
ã¯~.java.lang.String
ïŒå°ãªããšããããã¯javap
éã³ã³ãã€ã«ãããã¯ã©ã¹ããæ確ã«èŠãããšãã§ãjavap
ïŒãRetrolambdaãå£ããŸããããã¯åã«ã³ãŒãã®å€æãéãã«åæ¢ããã¯ã©ã¹ãçæããŸãããã©ã ã/ invokedynamic
ã ãã¹ãŠã®ã¯ã©ã¹ãé€å€ãªã¹ãã«æžã蟌ãããšã¯ãæ€çŽ¢ãé£ãããäœåãªãã«ããæ€çŽ¢ããããã«javap
ã䜿çšããŠã¯ã©ã¹ãã¡ã€ã«å
ãçªãå¿
èŠããããããããå®çšçã§ãªããšèããŠããŸãã
<target name="04-shade" depends="03-merge" description="Step 04: Rename java.* to ~.java.* in order to let RetroLambda work since MethodHandles require non-java packages"> <shade jar="${step03TargetFile}" uberJar="${step04TargetFile}"> <relocation pattern="java" shadedPattern="~.java"> <include value="java.lang.AutoCloseable"/> <include value="java.lang.Iterable"/> <include value="java.util.Arrays"/> <include value="java.util.AbstractMap"/> <include value="java.util.EnumMap"/> <include value="java.util.EnumMap$**"/> <include value="java.util.function.Consumer"/> <include value="java.util.function.Function"/> <include value="java.util.function.Supplier"/> <include value="java.util.Iterator"/> <include value="java.util.Map"/> <include value="java.util.Objects"/> <include value="java.util.Spliterator"/> <include value="java.util.Spliterator$**"/> <include value="java.util.Spliterators"/> <include value="java.util.Spliterators$**"/> <include value="java.util.stream.AbstractPipeline"/> <include value="java.util.stream.BaseStream"/> <include value="java.util.stream.ForEachOps"/> <include value="java.util.stream.ForEachOps$**"/> <include value="java.util.stream.PipelineHelper"/> <include value="java.util.stream.ReferencePipeline"/> <include value="java.util.stream.ReferencePipeline$**"/> <include value="java.util.stream.Sink"/> <include value="java.util.stream.Sink$**"/> <include value="java.util.stream.Stream"/> <include value="java.util.stream.StreamShape"/> <include value="java.util.stream.StreamOpFlag"/> <include value="java.util.stream.StreamOpFlag$**"/> <include value="java.util.stream.StreamSupport"/> <include value="java.util.stream.TerminalSink"/> <include value="java.util.stream.TerminalOp"/> </relocation> </shade> </target>
å°ããªäœè«ã çè«çã«ã¯ãAntã§ã®ãªã¹ãã®è€è£œã¯refid
ããµããŒãããèŠçŽ ã䜿çšããŠè§£æ±ºã§ããŸãããããã¯ããã€ãã®çç±ã§æ©èœããŸããã
<relocation>
ã¯äž»ã«refid
ãµããŒãããŸãããããã¯ããã®å±æ§ã®é¡äŒŒç©ãMavenå®è£
ã«åã«ååšããªãããã§ãã ãããŠã2ã€ã®å®è£
ãäºãã«1察1ã«äŒŒãŠããããšãæã¿ãŸãã å°ãªããšãä»ã®ãšããã
解ååŠçã«ã¯ã <relocation>
ãš<patternset>
ã¯ç°ãªããŸãã æåã®<include name=â...â
ãã2çªç®ã®<include value=â...â>
ãŸãã ããã§ãç§ã¯çãã®äœå°ããããŸãããç§ã¯äžè¬ã«åãå
¥ããããŠããåæã«ããŸãåŸããŸããã§ããã
- Mavenã®ãã©ã°ã€ã³ã§äœ¿çšããã
SimpleRelocator
ã¯ãã¯ã©ã¹ãã¡ã€ã«ãã¹ããµããŒãããŠããªãããã§ãã ãããã£ãŠã2çªç®ã®å Žåãã¯ã©ã¹åã¯ãåºåãæåãã¹ã©ãã·ã¥ã§ã¯ãªãããªãªãã§ãã圢åŒã§èšè¿°ããå¿
èŠããããŸãã å¥ã®éäºææ§ã ãã¡ããã移åã®ããã®ã«ãŒã«ã®ç¬èªã®å®è£
ãæžãããšãã§ããŸãããMavenãã©ã°ã€ã³ã®ã«ãŒã«ã®ãããã«ãççŸããŠããªããã°ãmaven-shade-pluginéçºè
ã«ãã®ãããªæ¡åŒµæ©èœãæäŸããããšæãã§ãããã ããããæå°éã®çµéšã§ãããã®ãããªèŠæ±ã«è¯å®çãªå¿çããã£ãå Žåã§ããå€ãã®æéãããããšèšããŸãã æéãç¯çŽããã ãã§ãã
ãããã£ãŠããããã®æ¬ ç¹ã¯ãã¹ãŠè§£æ±ºãããŸãããæããã«ãã®èšäºã®æ çµã¿å
ã§ã¯ãããŸããã
ã¹ããã5.解å
次ã®ã¹ãããã¯ã移åãããããã±ãŒãžã§JARãã¡ã€ã«ã解åããããšã§ããRetrolambdaã¯ãã£ã¬ã¯ããªã§ã®ã¿æ©èœããããã§ãã
<target name="05-unzip" depends="04-shade" description="Step 05: Unpacking shaded JAR in order to let Retrolamda work"> <unzip src="${step04TargetFile}" dest="${step05TargetDir}"/> </target>
ã¹ããã6. Retrolambda
å®éšã®äžå¿ïŒãã€ãã³ãŒãããŒãžã§ã³52ïŒJava 8ïŒãããŒãžã§ã³50ïŒJava 6ïŒã«å€æããŸãã ããã«ãäžèšã§äœ¿çšããããªãã¯ã«ãããRetrolambdaïŒãŸãã¯ãJDK 8ïŒã¯ã¯ã©ã¹ã«éãã«ããããŠè¿œå ã®è³ªåãªãã§ãã§ã«æ瀺ããŸãã ãŸããã¡ãœããã®ããã©ã«ããµããŒããæå¹ã«ããå¿
èŠããããŸããããã¯ãJava 8ã®å€ãã®æ°æ©èœãã¡ãœããäžã«æ§ç¯ãããŠããããã§ãã JRE 7以äžã§ã¯ãã®ãããªã¡ãœããã®æäœæ¹æ³ãããããªããããRetrolambdaã¯åå®çŸ©ãããŠããªãåã¯ã©ã¹ã®ã¡ãœããã®å®è£
ãåçŽã«ã³ããŒããŸãïŒããã«ããããæçµçãªã¢ããªã±ãŒã·ã§ã³ãšãã®ã©ã€ãã©ãªãã«å¯ŸããŠã®ã¿Retrolambdaã䜿çšããå¿
èŠããããŸãããã以å€ã®å Žåãããã©ã«ãã¡ãœããã®å®è£
ãåã«ååšããªãå Žåã«åé¡ãçºçããå¯èœæ§ãé«ãã§ãã
<target name="06-retrolambda" depends="05-unzip" description="Step 06: Perform downgrade from Java 8 to Java 6 bytecode"> <java jar="${retrolambdaJar}" fork="true" failonerror="true"> <sysProperty key="retrolambda.bytecodeVersion" value="50"/> <sysProperty key="retrolambda.classpath" value="${step05TargetDir}"/> <sysProperty key="retrolambda.defaultMethods" value="true"/> <sysProperty key="retrolambda.inputDir" value="${step05TargetDir}"/> <sysProperty key="retrolambda.outputDir" value="${step06TargetDir}"/> </java> </target>
ã¹ããã7. Zip
æ瀺ãããããŒãžã§ã³ã1ã€ã®ãã¡ã€ã«ã«æ»ããã·ã§ãŒããã©ã°ã€ã³ãå察æ¹åã«èµ·åããŸãã
<target name="07-zip" depends="06-retrolambda" description="Step 07: Pack the downgraded classes back before unshading"> <zip basedir="${step06TargetDir}" destfile="${step07TargetFile}"/> </target>
ã¹ããã8.ã·ã§ãŒãã£ã³ã°è§£é€
幞ããªããšã«ãã·ã§ãŒããã©ã°ã€ã³ãå察æ¹åãžã®ç§»åã§æ©èœããã«ã¯ã2ã€ã®ãã©ã¡ãŒã¿ãŒã ãã§ååã§ãã ãã®ã¹ãããã®æåŸã§ãã¢ããªã±ãŒã·ã§ã³å
ã®ããã±ãŒãžã¯å
ã«æ»ããã ~.java.*
java.*
åã³ã
<target name="08-unshade" depends="07-zip" description="Step 08: Relocate the ~.java package back to the java package"> <shade jar="${step07TargetFile}" uberJar="${step08TargetFile}"> <relocation pattern="~.java" shadedPattern="java"/> </shade> </target>
ã¹ããã9.é梱
ãã®ã¹ãããã§ã¯ãåŸã§2ã€ã®å¥ã
ã®JARãã¡ã€ã«ãçµã¿ç«ãŠãããã«ãã¯ã©ã¹ãåçŽã«è§£åããŸãã åã³èå³æ·±ããã®ã¯ãããŸããã
<target name="09-unpack" depends="08-unshade" description="Step 09: Unpack the unshaded JAR in order to create two separate JAR files"> <unzip src="${step08TargetFile}" dest="${step09TargetDir}"/> </target>
ã¹ããã10ããã³11ãããã¯
ãã¹ãŠã®ã¯ã©ã¹ããŸãšããŸãããåå¥ã«ãæ°ããã©ã³ã¿ã€ã ããšãã¹ãã¢ããªã±ãŒã·ã§ã³èªäœãäœæããŸãã ãããŠåã³-éåžžã«äºçŽ°ã§é¢çœããªãã¹ãããã
<target name="10-pack" depends="09-unpack" description="Step 10: Pack the downgraded Java 8 runtime classes"> <zip basedir="${step09TargetDir}" destfile="${step10TargetFile}"> <include name="java/**"/> </zip> </target> <target name="11-pack" depends="09-unpack" description="Step 11: Pack the downgraded application classes"> <zip basedir="${step09TargetDir}" destfile="${step11TargetFile}"> <include name="test/**"/> </zip> </target>
è©Šéšçµæ
以äžã§ãã ã¿ãŒã²ãããã£ã¬ã¯ããªã«ã¯ãå®éã®Stream APIã®å°ããªåŽé¢ã®å°ããªããŒããå«ãŸããŠãããJava 6ã§å®è¡ã§ããŸãã ãããè¡ãã«ã¯ãAntã®å¥ã®ã«ãŒã«ãäœæããŸãã
<target name="run-as-java-6" description="Runs the target artifact in Java 6"> <fail unless="env.JDK_6_HOME" message="JDK_6_HOME not set"/> <java jvm="${env.JDK_6_HOME}/bin/java" classpath="${step11TargetFile}" classname="${mainClass}" fork="true" failonerror="true"> <jvmarg value="-Xbootclasspath/p:${step10TargetFile}"/> <arg value="foo"/> <arg value="bar"/> <arg value="baz"/> </java> </target>
ãããŠããã§ã¯ãããŸãæšæºçã§ã¯ãªã-Xbootclasspath/p
䜿çšã«ç¹å¥ãªæ³šæãæãå¿
èŠããããŸãã èŠããã«ããã®æ¬è³ªã¯æ¬¡ã®ãšããã§ããæåã®å Žæã§åºæ¬ã¯ã©ã¹ãããŒãããå ŽæãJVMãæå®ã§ããããã«ããŸãã ãã®å Žåãå
ã®rt.jarã®æ®ãã®ã¯ã©ã¹ã¯ãå¿
èŠã«å¿ããŠ$JAVA_HOME/jre/lib/rt.jar
ããé
延ããŒããã$JAVA_HOME/jre/lib/rt.jar
ã ããã-verbose:class
ã¯ãJVMã®èµ·åæã«-verbose:class
ã¹ã€ããã䜿çšã-verbose:class
ã
ãµã³ãã«èªäœãå®è¡ããã«ã¯ãJDK 6ãŸãã¯JRE 6ãæãJDK_6_HOME
ç°å¢å€æ°ãå¿
èŠã§ãJDK_6_HOME
run-as-java-6
åŒã³åºããããšã移æ€ãæåããçµæãæšæºåºåã«åºåãããŸãã
PRE: stream >FOO >BAR >BAZ POST: stream
åäœããŸããïŒ ã¯ãïŒ
ãããã«
Java 8ã§ã³ãŒããèšè¿°ããããšã«æ
£ããŠããŠããã®ã³ãŒããå€ãããŒãžã§ã³ã®Javaã§åäœããããã«ããããšæããŸãã ç¹ã«ãããªãå€ããŠéãã³ãŒãããŒã¹ãå©çšã§ããå Žåã ãŸããã€ã³ã¿ãŒãããäžã§ãå€ãããŒãžã§ã³ã®Javaã§Stream APIã䜿çšããæ©äŒããããã©ãããšãã質åãããèŠãããšãã§ããå Žåã圌ãã¯åžžã«ããŒãšèšããŸãã ãŸããã»ãšãã©ãªãã ãããŠåœŒãã¯æ£ããã§ãããã ãã¡ãããå€ãJREã§æ©èœããåæ§ã®æ©èœãæã€ä»£æ¿ã©ã€ãã©ãªãæäŸãããŸãã å人çã«ã¯Google Guavaã«æãæéãåããŠãããJava 8ã§ã¯äžååãªå Žåã«ãã䜿çšããŸãã
å®éšçããã¯ã¯å®éšçããã¯ã§ããããã¢ã³ã¹ãã¬ãŒã·ã§ã³ãè¶
ããŠããã«åé²ããããšã¯çã«ããªã£ãŠãããšã¯æããŸããã ããããç 究ãšå®éšã®ç²Ÿç¥ã®ããã«ããªãã§ããïŒ GitHubã®å®éšã詳ããèŠãããšãã§ããŸã ã
æªè§£æ±ºããã³æªè§£æ±ºã®åé¡
Antã®refid
ã«å ããŠãå人çã«ã¯ããã€ãã®è³ªåãæ®ã£ãŠããŸãã
ãã®äŸã¯ä»ã®JVMå®è£
ã§æ©èœããŸããïŒ
Oracle JVMã§å®è¡ãããŸãããOracleã©ã€ã»ã³ã¹ã§ã¯ã -Xbootclasspath
ã䜿çšããŠrt.jar
éšåã眮ãæããã¢ããªã±ãŒã·ã§ã³ã®ãããã€ãçŠæ¢ãããŠã-Xbootclasspath
ã
æåã®å埩ã«é ŒãããšãªããäŸåé¢ä¿ã¯ã©ã¹ã®ãªã¹ããèªåçã«äœæããããšã¯å¯èœã§ããïŒ
ç§ã¯å人çã«ãã®ãããªåæã®èªåæ¹æ³ãç¥ããŸããã java.util.stream.*
å
šäœãå®è¡ããããšããããšãã§ãjava.util.stream.*
å®å
šã«ããã±ãŒãžåã§ããŸãããããã«åé¡ããããšæããŸãã
Dalvik VMã§ãã®äŸãå®è¡ããããšã¯ã§ããŸããïŒ
ããã¯AndroidãæããŸãã çµæãdxã«æž¡ããŠãå®éã®ããã€ã¹ã§-Xbootclasspath
ã䜿çšããŠDalvik VMãçŽæ¥å®è¡ããããšããŸããããDalvikã¯ãã®ãããªèŠæ±ãæ°žç¶çã«ç¡èŠããŸãã ãã®çç±ã¯ãDalvik VMã®ã¢ããªã±ãŒã·ã§ã³ãZygoteããæ¥ãŠããããã ãšæãããŸããã Zygoteã¯æããã«ãã®ãããªæå³ãèªèããŠããŸããã ããããªãã§ããªãã®ããäœãåé¡ãªã®ãã«ã€ããŠã¯ã StackOverflowã§èªãããšãã§ããŸãã ãããŠã -Xbootclasspath
ã§dalvikvm
ãèµ·åã§ããã°ãã¢ããªã±ãŒã·ã§ã³èªäœã®ã©ã³ãã£ãŒãå¿
èŠã«ãªãããã®ããŒãã¯ã©ã¹ãã¹ã眮ãæãããããšæãããŸãã ãã®ãããªã·ããªãªã¯å¯èœã§ã¯ãªãããã§ãã
GWTã¯ã©ãã§ããïŒ
ãããŠãããã¯ãŸã£ããç°ãªã話ã§ãããç°ãªãã¢ãããŒãã§ãã å
æ¥ãåŸ
æã®GWT 2.8.0 ïŒ2幎åã®ããŒãžã§ã³2.7.0ïŒã®ãªãªãŒã¹ãè¡ãããJava 8ã§èšè¿°ããããœãŒã¹ã³ãŒãã®ã©ã ãããã³ãã®ä»ã®æ©èœãå®å
šã«å®è£
ãããŸããããããã¯ãã¹ãŠSNAPSHOTã®ãªãªãŒã¹åã§ããããŒãžã§ã³ã GWTã¯ãœãŒã¹ã³ãŒãã§ã®ã¿æ©èœãããããGWTã§ãã€ãã³ãŒããæ··ä¹±ãããããšã¯ã§ããŸããã Stream APIãã¯ã©ã€ã¢ã³ãåŽã«ç§»æ€ããã«ã¯ããœãŒã¹ãGWTã«é©ãã圢åŒã«å€æããããªããã»ããµïŒRxJavaã®ç§»æ€äŸïŒã«æž¡ããåŸãJDK 8ãããœãŒã¹ã®äžéšãåéããã ãã§ãããšæããŸãã