`
isiqi
  • 浏览: 16031037 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

JAVA-程序设计教程-静态库、动态连接库与LGPL授权,GPL授权

阅读更多

程序编制一般需经编辑、编译、连接、加载和运行几个步骤。在我们的应用中,有一些公共代码是需要反复使用,就把这些代码编译为“库”文件;在连接步骤中,连接器将从库文件取得所需的代码,复制到生成的可执行文件中。这种库称为静态库,其特点是可执行文件中包含了库代码的一份完整拷贝;缺点就是被多次使用就会有多份冗余拷贝。

为了克服这个缺点可以采用动态连接库。这个时候连接器仅仅是在可执行文件中打上标志,说明需要使用哪些动态连接库;当运行程序时,加载器根据这些标志把所需的动态连接库加载到内存。

另外在当前的编程环境中,一般都提供方法让程序在运行的时候把某个特定的动态连接库加载并运行,也可以将其卸载(例如Win32的LoadLibrary()&FreeLibrary()和Posix的dlopen()&dlclose())。这个功能被广泛地用于在程序运行时刻更新某些功能模块或者是程序外观。

What is ClassLoader?

与普通程序不同的是,Java程序(class文件)并不是本地的可执行程序。当运行Java程序时,首先运行JVM(Java虚拟机),然后再把Java class加载到JVM里头运行,负责加载Java class的这部分就叫做Class Loader。

JVM本身包含了一个ClassLoader称为Bootstrap ClassLoader,和JVM一样,Bootstrap ClassLoader是用本地代码实现的,它负责加载核心Java Class(即所有java.*开头的类)。另外JVM还会提供两个ClassLoader,它们都是用Java语言编写的,由Bootstrap ClassLoader加载;其中Extension ClassLoader负责加载扩展的Java class(例如所有javax.*开头的类和存放在JRE的ext目录下的类),Application ClassLoader负责加载应用程序自身的类。

When to load the class?

什么时候JVM会使用ClassLoader加载一个类呢?当你使用java去执行一个类,JVM使用Application ClassLoader加载这个类;然后如果类A引用了类B,不管是直接引用还是用Class.forName()引用,JVM就会找到加载类A的ClassLoader,并用这个ClassLoader来加载类B。

Why use your own ClassLoader?

似乎JVM自身的ClassLoader已经足够了,为什么我们还需要创建自己的ClassLoader呢?

因为JVM自带的ClassLoader只是懂得从本地文件系统加载标准的java class文件,如果编写你自己的ClassLoader,你可以做到:
1)在执行非置信代码之前,自动验证数字签名
2)动态地创建符合用户特定需要的定制化构建类
3)从特定的场所取得java class,例如数据库中
4) 等等

事实上当使用Applet的时候,就用到了特定的ClassLoader,因为这时需要从网络上加载java class,并且要检查相关的安全信息。

目前的应用服务器大都使用了ClassLoader技术,即使你不需要创建自己的ClassLoader,了解其原理也有助于更好地部署自己的应用。

ClassLoader Tree & Delegation Model

当你决定创建你自己的ClassLoader时,需要继承java.lang.ClassLoader或者它的子类。在实例化每个ClassLoader对象时,需要指定一个父对象;如果没有指定的话,系统自动指定

ClassLoader.getSystemClassLoader()为父对象。如下图:

在Java 1.2后,java class的加载采用所谓的委托模式(Delegation Modle),当调用一个ClassLoader.loadClass()加载一个类的时候,将遵循以下的步骤:
1)检查这个类是否已经被加载进来了?
2)如果还没有加载,调用父对象加载该类
3)如果父对象无法加载,调用本对象的findClass()取得这个类。

所以当创建自己的Class Loader时,只需要重载findClass()这个方法。

Unloading? Reloading?

当一个java class被加载到JVM之后,它有没有可能被卸载呢?我们知道Win32有FreeLibrary()函数,Posix有dlclose()函数可以被调用来卸载指定的动态连接库,但是Java并没有提供一个UnloadClass()的方法来卸载指定的类。

在Java中,java class的卸载仅仅是一种对系统的优化,有助于减少应用对内存的占用。既然是一种优化方法,那么就完全是JVM自行决定如何实现,对Java开发人员来说是完全透明的。

在什么时候一个java class/interface会被卸载呢?Sun公司的原话是这么说的:"class or interface may be unloaded if and only if its class loader is unreachable. Classes loaded by the bootstrap loader may not be unloaded."

事实上我们关心的不是如何卸载类的,我们关心的是如何更新已经被加载了的类从而更新应用的功能。JSP则是一个非常典型的例子,如果一个JSP文件被更改了,应用服务器则需要把更改后的JSP重新编译,然后加载新生成的类来响应后继的请求。

其实一个已经加载的类是无法被更新的,如果你试图用同一个ClassLoader再次加载同一个类,就会得到异常(java.lang.LinkageError: duplicate class definition),我们只能够重新创建一个新的ClassLoader实例来再次加载新类。至于原来已经加载的类,开发人员不必去管它,因为它可能还有实例正在被使用,只要相关的实例都被内存回收了,那么JVM就会在适当的时候把不会再使用的类卸载。

请懂开源授权的朋友点评下。

第一点:
1)LGPL规定,修改的代码必须开源,只使用的话可以不开源。
(注:很多Linux的库也是用LGPL)Okay,我不改你Qt的代码,只用你的Qt库,行吧?
(注:Qt 库表现在windows平台就是.dll文件,在Mac和Linux平台就是.so文件) 也就是说你只能动态链接dll或是so文件。但是这些dll,so文件是Nokia的版权所有,你没有权力发布它们,也就是说你的最终产品不能自己带上这些dll或so文件。My God! 你得让客户自己去诺鸡鸭网站去下载Qt库,而且Qt 4.5, 4.6, X.X的版本的dll又不一样! (注:Nokia曾说,开发者打好安装用的程序包后,当客户安装时,会自动从网站下载。

问题是:如果不闭源的商业(私有)程序,按LGPL协议,基本上只能使用动态链接的。
那就涉及到一个打包Qt的DLL的问题。

那么,这些DLL是否允许打包到商业程序的安装包中呢?
即,在没有购买Qt商业授权的情况下,是否有权利在自己的安装包中附带Qt的DLL?


因为只要附带了Qt的DLL,就相当于发布了Qt的DLL。
但这些DLL的版权是属于Nokia的!

这会带来新的问题:

1)这个功能还没实现,诺鸡鸭的步子比较慢,不知何时?
2)不能做成Zip安装包,这对个人开发者很重要。

3)客户机必须联上互联网,有时候这是一个不可能的任务,尤其对于Firewall之内的服务器或内部服务器来说。

4)也是最重要的一点,严重影响客户体验。Hi Nokia,记住,你不是Microsoft,不要自视过高。
看了上面这些,估计很多人不想再看后面的内容了。还好问题也不多了。

大家讨论一下Qt的LGPL授权吧。
别程序到了发布阶段时,
才发现,
必须得买Qt商业版授权,
才能有个像样的发布,
才能赚Money!

1、关于LGPL,Loaden你可能理解有所偏差,不是只能动态链接的,动态链接的结果是你开发的软件可以是任意授权(你自己定),静态链接的结果是至少是LGPL授权(根据LGPL修改部分代码要公布的原则,静态链接相当于修改本体,是LGPL的附属品),Qt、wx等LGPL授权的都以此为准。


2、Qt既然是LGPL授权,那么也不是非得需要使用它的dll库的,你自己可以自行编译,但是你如果修改了Qt库的某一部分,那么必须附带或公开你修改后的源码和补丁。

问题就在这里!!我们能否使用自己编译的Qt的动态库?即使在没有修改Qt的任何源码的情况下。
如果这些DLL(包括自己编译的)的版权属于Nokia,那么,我们是否有在安装包中附带这些DLL的权利(或自由)?
还是必须得从Qt官方站(nokia)上下载其编译好的二进制(DLL)?

自行编译不算修改,要不然LGPL就没存在的意义了,wx不也是LGPL授权么,而且他官方连prebuilt都没提供。

wx虽然也是LGPL授权,但是它还有另外一条补丁:就是商业程序基于wx开发,也可以静态链接。
http://www.wxwidgets.org/about/newlicen.htm


以前从来没想过这个问题,网上查了很久,也没有一个明确的说法。


3、“不能做成Zip安装包”,这个提法我没见到过,我认为只要遵守1和2,那么你以什么形式发布都是可行的。

邮件讨论内容。

我:
http://www.google.com.hk/search?hl=zh-CN&source=hp&biw=1440&bih=708&q=Qt+LGPL+%E5%8A%A8%E6%80%81%E9%93%BE%E6%8E%A5+%E5%88%86%E5%BC%80%E5%8F%91%E5%B8%83&aq=f&aqi=&aql=&oq=&gs_rfai=
看关键词。

http://www.qteverywhere.com/archives/157
这个文章中提到:

那么LGPL则更适合,但必须满足下面两个条件:
1. 你的应用程序应该动态链接Qt函数库,并使你的应用程序与未做修改的LGPL库分开发布。同时必须确保使用者(接受者)知道应用程序使用了LGPL版本的Qt;
2. 如果你对LGPL版本的Qt进行了任何修改,并发布,则必须遵循LGPL 条款发布。任何使用者有权利得到这些修改(通常情况下是源代码),并且确保使用者可以通过这些修改自己生成相应你修改过的Qt版本。

xunxun1982:
这个说法在LGPL协议里并没有说,所以即使有,也是Nokia自己说的,所以还得问Nokia……

---------------------

我:
http://www.qtcentre.org/archive/index.php/t-28342.html
这里似乎有相关的讨论,只是我英语太差,还没看明白。
能否帮我看一下里面的观点。
特别是nokia的faq.

xunxun1982:
他们好像偏向可以自由分发的。
lz问了一些问题
1楼的观点是:只有你没改动态连接库,就可以自由使用,这样可以让其他人把lgpl的部分替换成他们需要的版本。

2楼指出
- libgcc_s_dw2-1.dll
- mingwm10.dll
这二者是公共许可,所以可以随意分发。lgpl的部分如果静态链接那就成了lgpl库的一部分。

3楼提出的观点很有意思,他说lgpl一般情形下是动态链接的,但是你也可以提供你自己部分的中间文件(.o),这样可以方便其他人和lgpl库 进行链接。

4楼就是说可以自由分发Qt的dll,它那个faq挺多的,我不知道他指的那一项,我先慢慢看看。

5楼基本上就是重复问了问题,不需要看。

顺着faq的链接,我摸到了这个链接http://blog.qt.nokia.com/2009/11/30/qt-making-the- right-licensing-decision/

里面说到

LGPL
The LGPL is a license agreement written (and copyrighted) by the Free Software Foundation. The LGPL is a “copyleft” open source software license but is less restrictive than the GNU GPL.
Facts:
The LGPL version 2.1 license was created by the Free Software Foundation and is copyrighted by them. This means that the terms cannot be changed or negotiated by us.
Users can develop proprietary applications that dynamically link to the Qt libraries without having to release their application source code.
All modifications that are considered “works based on the Library” must be licensed under the LGPL v. 2.1 and need to be shared with downstream recipients in source code format (i.e. contributed back). In the Qt context this means that modifications made to Qt itself must be licensed under the terms of the LGPL.
If you are shipping an executable, you must include any data and utility programs needed for reproducing the executable (i.e. must provide components needed to recompile with a new version of the library) unless such data and utility programs are normally distributed with the major components of the operating system on which the executable runs

说到LGPL的分发是royalty free,就是无版权的意思。

------------

谢谢xunxun1982!


Handy reference chart:

CommercialLGPL v. 2.1GPL v.3.0
License costLicense fee chargedNo licensing feeNo licensing fee
Must provide source code for changes to QtNo, modifications can be closedSource code must be providedSource code must be provided
Can create proprietary applicationsYes – no source code must be disclosedYes – if dynamically linking to the Qt libraryNo, application is subject to the GPL and source must be available
SupportYes, with a valid maintenance agreementNot included, but available separately for purchaseNot included, but available separately for purchase
Charges for device runtimesYesNo, distribution is royalty freeNo, distribution is royalty free

原文:http://topic.csdn.net/u/20101214/21/277e27b9-2577-4bea-b612-a63215b2cfa4.html

LGPL概念

  LGPL 是 GNU Lesser General Public License (GNU 宽通用公共许可证)的缩写形式,旧称 GNULibrary General Public License (GNU 库通用公共许可证),在宽松程度上与 BSD, Apache,XFree86 许可证相似

  GPL(General Public License)和LGPL( Lesser General Public License)是GNU的两种License。越来越多的自由软件(Free Software)使用GPL作为其授权声明,如果对GPL一点都不了解,有可能在使用自由软件时违反了GPL的授权。如果是个人或不正规的公司倒也无所谓,但如果是有规模的公司,恐怕会有被起诉的风险。

  在使用Log4cpp时我想到了授权的事情,于是有了兴趣对GPL做一下了解。这是必要的,因为公司也维护了一个验证过的自由软件库,里面包含的自由软件除了功能上是可靠的,另外就是一定可以被私有使用的,否则后果很严重。

  Log4cpp最初的版本使用GPL作为授权声明的,在0.2.1版本以后改用更为宽松的LGPL。LGPL最初是Library GPL的缩写,后来改称作Lesser GPL,即为更宽松的GPL。当一个自由软件使用GPL声明时,该软件的使用者有权重新发布、修改该软件,并得到该软件的源代码;但只要使用者在其程序中使用了该自由软件,或者是使用修改后的软件,那么使用者的程序也必须公布其源代码,同时允许别人发布、修改。也就是说,使用GPL声明下的的自由软件开发出来的新软件也一定是自由软件。

  LGPL是GPL的变种,也是GNU为了得到更多的甚至是商用软件开发商的支持而提出的。与GPL的最大不同是,可以私有使用LGPL授权的自由软件,开发出来的新软件可以是私有的而不需要是自由软件。所以任何公司在使用自由软件之前应该保证在LGPL或其它GPL变种的授权下。

Richard Stallman关于GPL和LGPL的论述

  为什么你不应该使用LGPL发布你的下一个库

  GNU计划在使用库时有两个首要的许可证.一个是GNU LGPL(库GPL);另一个是普通的GNU GPL.选择不同的许可有很大的不同:选择LGPL允许在私有程序中使用该库;选择普通的GPL则只允许在自由软件中使用它.

  关于哪一种许可证对指定的库是最好的这一问题实际上是一个策略问题,它取决于实际情况.当前,大多数的GNU库被采用LGPL,这意味着我们只使用着其中的一个策略,而忽略了另一个. 所以现在我们在寻求更多以普通的GPL许可证形式发布的库.

  私有软件开发者有金钱上的优势;自由软件开发者需要相互之间利用各自的优势.对一个库采用普通的GPL对自由软件开发者的优势要大于对私有软件开发者: 他们可以使用的库对于私有软件开发者是不可利用的.

  使用普通的GPL并不是对于所有的库都有好处.在某些情况下更有理由来使用LGPL.最常见的情况就是当一个自由库的特性可以很容易地被私有软件以其他可替代库来实现.在这种情况下,库不能给与自由软件任何特别的优势,因而最好还是为LGPL发布该库.

  这也就是为什么我们为GNU C 库选择LGPL.总之,有很多的其他C库;我们使用GPL发布该库,将迫使私有软件开发者不得不使用其它的库--对他们来说这不成问题,而我们则有了麻烦.

  然而,当一个库所提供的功能是非常独特的时候,如GNU Readline, 情况就大不一样了. Readline库可实现输入编辑和记录交互式程序操作,这在别处通常是不可多得. 在GPL下发布它并限制它只能在自由程序中使用, 这我们的社团是一个重要的促进.至少今天某个应用程序之所以是自由软件,只是因为它必需要用到Readline.

  如果我们收集一些强大的、私有软件中没有相类似东西的、采用GPL的库,它们将提供一系列有用的模块用于新的自由软件的构造. 这对于将来的自由软件开发将是一个显著的优势, 一些项目将为了使用这些库而考虑使软件自由化. 大学的项目是易于被影响的;而且今天,随着某些公司开始考虑使软件自由化, 甚至一些商业项目也会由此受到影响.

  私有软件开发者试图否认自由竞争的重要性, 他们会拼命说服作者不要将库使用GPL来发布. 例如,他们会呼吁利己主义,信誓旦旦地说如果我们让他们在私有软件产品中使用代码,将有“更多的用户”用到该库. 流行是一种诱惑,它使一个库开发者倾向于相信这种观点:社会首先需要的是促进一种库的流行;.

  但是我们不应该听从这种诱惑,因为如果我们联合起来,我们可以做得更好.我们这些自由软件开发者应该相互支持. 通过发布只能为自由软件使用的库,我们可以互相帮助,使彼此的自由软件包优于其它的私有替代品. 整个自由软件运动将会有更多的机会,因为自由软件作为一个整体将会在竞争中表现更佳.

  因为"LGPL(Library GPL)"的称呼传达了关于这一问题的错误观点,我们计划将称呼改为"次级GPL(Lesser GPL)".事实上要更换名称要花一定的时间,但你不必再等--你可以现在就发布应用GPL许可证的库.

诺基亚Qt兼容Android和iOS 欲借道iPhone上阵

原文:http://it.sohu.com/20100810/n274101953.shtml

创新不足规模搭救,原iOS或Android应用软件稍加改造即可应用至诺基亚手机

  作者:方南

  如果你是苹果iOS或谷歌Android应用的开发商,那么你将得到来自诺基亚的橄榄枝。近日,在海外一次诺基亚OVI应用开发者大会上,Qt作为唯一的探讨重点被放到了台面上。Q t是由“奇趣科技”(Trolltech公司)开发的平台应用和用户界面框架。2008年,诺基亚以1.5亿美元买下了奇趣科技。按照诺基亚方面对Qt的最新描述,其跨平台特性将被发挥到极致———一些iO S或A ndroid的应用,开发者只要稍做改动就能移植到诺基亚智能手机中。

  Qt兼容Android和iOS

  在全球A ndroid系统及iPhone手机的冲击下,诺基亚在智能手机产品环节始终未能找到迎敌的亮点,但这并不代表这条行业巨鳄将始终处于被动挨打的局面。无法在创新上战胜对手,诺基亚再一次祭起了规模优势的大旗,而Q t则是新一轮进攻潮的先锋。(南方都市报 www.nddaily.com SouthernMetropolisDailyMark 南都网)

  所谓Qt,指的是一种跨平台的应用和用户界面框架,开发人员可通过这个平台,方便地将自己的应用程序移植到目前市面上的主要操作系统中。有消息称,在移动平台方面,Q t除了诺基亚自家的Sym bian之外,还将兼容Android和iOS.

  缘起在诺基亚开发者论坛,有关Q t的描述除了会兼容诺基亚自己的Sym bianS60、S40、Sym bian3、M eego等多个平台外,还新加入了对A ndroid和iO S兼容的介绍。

  “简单来说,只要硬件足够支持,通过Q t,开发者可以较容易地将自己原本制作的iPhone软件或A ndroid软件稍加改造就能移植到诺基亚手机中。”国内一家iO S系统信息安全软件开发商负责人向南都记者表示,这对于开发者有较高的吸引力,因为诺基亚在智能手机市场份额上依然占绝对优势。

  规模效应的吸引

  如今的智能手机市场花开两朵各表一枝,诺基亚的Sym bian占据了最大的份额,A ndroid和iO S却有着更高的人气。令诺基亚郁闷的是,因为对手的“高人气”,自己的份额正逐渐被蚕食,却又难以通过老迈的Sym bian系统本身和不受消费者青睐的工业设计来翻盘。

  Qt就像是一根救命稻草。

  2008年诺基亚以1.5亿美元购入Q t的开发公司“奇趣科技”时,苹果仍然是智能手机市场的新军,A ndroid更是毫无影响力。然而两年后的情况已大不相同。(南方都市报 www.nddaily.com SouthernMetropolisDailyMark 南都网)

  拉拢应用开发商

  诺基亚开发者论坛引用一位开发者的言论称,“过去花了一年半的时间才在Sym bian平台上开发出的原型软件,现通过Q t,仅需要三到四周就能完成”。

  事实上近来诺基亚一直在降低门槛,以拉拢应用开发商。除了在Q t的兼容性做文章外,还实施了Sym bian软件免费签名等。

  “不一定是抢苹果和谷歌的开发商,只希望他们在做软件的时候,也能想起来做一个诺基亚的版本。”华捷咨询电子消费行业分析师李元凯认为,过去的诺基亚和Sym bian一枝独秀,不愁没“生意”。但随着反复被抨击,现在的诺基亚对开发者的态度,已经发生了转变。

  采写:南都记者方南  

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics