java字节码
Oracle诉Google一案认为,复制Java API的结构,序列和组织是侵犯版权的行为。 侵犯版权不仅是复制行为,而且还适用于拥有该作品副本的所有中间方。
那就是编写/编译任何JVM语言的人,以及在他们拥有的任何设备上都有JAR文件的人,包括旧摩托罗拉翻盖手机上的Java ME applet。 实际上,JVM的所有版本都非常普及,每个工业化国家的每个成年人都有可能在某个地方运行JVM。
而且每个非Sun / Oracle JAR文件中都嵌入了部分或全部Java API的副本,因为从技术上讲,为了调用API,必须在已编译的字节码中包含API的影子。
让我示范一下。
这是我编写的一个完全合法的Java程序,我拥有以下内容的版权:
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);}}
那里什么都没有侵权。 我通过OpenJDK Java编译器javac
运行该程序,该程序生成一个HelloWorld.class
文件。 根据业界通常使用Java和编译器的方式,产生的字节码是源代码的派生作品,我拥有源代码的版权。
因此,让我们看一下使用javap
反汇编的结果字节码:
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 要求调用站点(调用代码的位置)包括有关被调用的API的信息,以便JVM找出要调用的方法。 不仅是方法名称,而且还有传入的参数类型和预期的返回类型。
因此,每个已编译的JAR都包含嵌入其中的Java API的某些部分。 根据Oracle的决定,每个编译的JAR文件都侵犯了版权。
“但是,”您说,“ JAR文件并不包含所有有争议的API。”
首先,多少就足够了。 Oracle法院明确拒绝了有关API仅占Java基类整体工作的一小部分,并且百分比论据没有说服力的论点。
其次,对于像Maven Central这样的存储了成千上万个JAR文件的存储库,基本上所有Java API都被复制到这些JAR文件中存储的集合作品中。
该怎么办?
如果我要托管大量的JAR文件,我会打电话给我的律师试图弄清楚该怎么做。 是的,也许有一个引诱论据,因为Oracle分发了javac
,因此诱使我复制Java API。 但是,这仍然是对Oracle法院判决的技术性违反。
如果我是Apache Software Foundation或Free Software Foundation,我将在今天早上提出单方面请求以中止 Oracle的决定,因为这意味着我们一直在考虑的是可以在其上进行许可的软件我们的开放条款实际上包含Oracle版权代码,我们将不得不暂停所有与JVM相关的开源项目。
哦,我要指出的是,如果Oracle声称复制到JAR文件中的API不受版权保护,那么Google要做的就是从Maven Central中提取所有JAR文件,在所有这些API中找到所有Java API引用。 JAR文件,并使用该信息声明适用于Android的API。 最多大约要花10个工作日。
翻译自: https://www.javacodegeeks.com/2014/05/okay-everybody-who-touches-java-bytecode.html
java字节码