好的,每个接触Java字节码的人
Oracle訴Google一案認(rèn)為,復(fù)制Java API的結(jié)構(gòu),序列和組織是侵犯版權(quán)的行為。 侵犯版權(quán)不僅是復(fù)制行為,而且還適用于擁有該作品副本的所有中間方。
那就是編寫/編譯任何JVM語言的人,以及在他們擁有的任何設(shè)備上都有JAR文件的人,包括舊摩托羅拉翻蓋手機上的Java ME applet。 實際上,JVM的各個方面都如此普及,每個工業(yè)化國家的每個成年人都可能在某個地方運行了JVM。
而且每個非Sun / Oracle JAR文件都嵌入了部分或全部Java API的副本,因為從技術(shù)上講,為了調(diào)用API,必須在已編譯的字節(jié)碼中包含API的影子。
讓我示范一下。
這是我編寫的一個完全合法的Java程序,我擁有以下內(nèi)容的版權(quán):
public class HelloWorld {public static void main(String[] args) {int strlen = 0;for (int x = 0; x < args.length; x++) {strlen += args[x].length();}System.out.println("Hello, world, you passed in "+args.length+" arguments, "+"total size: "+strlen);}}那里什么都沒有侵權(quán)。 我通過OpenJDK Java編譯器javac運行該程序,該程序生成一個HelloWorld.class文件。 根據(jù)業(yè)界通常使用Java和編譯器的方式,產(chǎn)生的字節(jié)碼是源代碼的派生作品,我擁有源代碼的版權(quán)。
因此,讓我們看一下使用javap反匯編的結(jié)果字節(jié)碼:
dpp@crown:~/proj/dpp-blog/images$ javap -c HelloWorld Compiled from "HelloWorld.java" public class HelloWorld {public HelloWorld();Code:0: aload_0 1: invokespecial #1 // Method java/lang/Object."<init>":()V4: return public static void main(java.lang.String[]);Code:0: iconst_0 1: istore_1 2: iconst_0 3: istore_2 4: iload_2 5: aload_0 6: arraylength 7: if_icmpge 2510: iload_1 11: aload_0 12: iload_2 13: aaload 14: invokevirtual #2 // Method java/lang/String.length:()I17: iadd 18: istore_1 19: iinc 2, 122: goto 425: getstatic #3 // Field java/lang/System.out:Ljava/io/PrintStream;28: new #4 // class java/lang/StringBuilder31: dup 32: invokespecial #5 // Method java/lang/StringBuilder."<init>":()V35: ldc #6 // String Hello, world, you passed in 37: invokevirtual #7 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;40: aload_0 41: arraylength 42: invokevirtual #8 // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;45: ldc #9 // String arguments, 47: invokevirtual #7 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;50: ldc #10 // String total size: 52: invokevirtual #7 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;55: iload_1 56: invokevirtual #8 // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;59: invokevirtual #11 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;62: invokevirtual #12 // Method java/io/PrintStream.println:(Ljava/lang/String;)V65: return }噢,我的……看,某些Java API完全插入了代碼中。
實際上,JVM 要求調(diào)用站點(調(diào)用代碼的位置)包括有關(guān)所調(diào)用API的信息,以便JVM找出要調(diào)用的方法。 不僅是方法名稱,而且還有傳入的參數(shù)類型和預(yù)期的返回類型。
因此,每個已編譯的JAR都包含嵌入其中的Java API的一部分。 根據(jù)Oracle的決定,每個編譯的JAR文件都侵犯了版權(quán)。
“但是,”您說,“ JAR文件并不包含所有有爭議的API。”
首先,多少就足夠了。 Oracle法院明確拒絕了有關(guān)API僅占Java基類總體工作的一小部分且百分比論據(jù)沒有說服力的論點。
其次,對于像Maven Central這樣的存儲了成千上萬個JAR文件的存儲庫,基本上所有Java API都被復(fù)制到這些JAR文件中存儲的集合作品中。
該怎么辦?
如果我要托管大量的JAR文件,我會打電話給我的律師試圖弄清楚該怎么做。 是的,也許有一個引誘論點,因為Oracle分發(fā)了javac ,因此誘使我復(fù)制Java API。 但是,這仍然是對Oracle法院判決的技術(shù)性違反。
如果我是Apache Software Foundation或Free Software Foundation,那么我將在今天早上提出單方面請求以中止 Oracle的決定,因為這意味著我們一直在考慮的是我們可以許可使用的軟件我們的開放條款實際上包含Oracle版權(quán)代碼,我們將不得不暫停所有與JVM相關(guān)的開源項目。
哦,我要指出的是,如果Oracle聲稱復(fù)制到JAR文件中的API不受版權(quán)保護,那么Google要做的就是從Maven Central中提取所有JAR文件,在所有這些API中找到所有Java API引用。 JAR文件,并使用該信息聲明適用于Android的API。 最多大約需要10個工作日的工作量。
翻譯自: https://www.javacodegeeks.com/2014/05/okay-everybody-who-touches-java-bytecode.html
總結(jié)
以上是生活随笔為你收集整理的好的,每个接触Java字节码的人的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 四川网站备案(四川省备案网)
- 下一篇: 安卓光标软件(安卓光标)
