FAQ
From Tuscany中文社区
[编辑] 编译与开发中的问题
[编辑] 我需要哪个版本的 Java? |
IBM 和 Sun 的 JDK 1.5 都可以支持Tuscany,并且也是社区一般情况下使用的。
不能使用JDK1.4,因为Tuscany SCA的很多代码使用了JDK1.5的新特性,如泛型和注释。
JDK1.6 在XML流处理方面还存在一些问题,有些时候会带来一些问题。我们面前也在跟踪这类问题。 如果你遇到以下的错误,则表明它来自JDK1.6。
- javax.xml.stream.FactoryConfigurationError: Provider
- javax.xml.stream.XMLInputFactory could not be instantiated:
- java.lang.InstantiationException at javax.xml.stream.XMLInputFactory.newInstance(XMLInputFactory.java:158)
[编辑] 我需要哪个版本的 Maven? |
为了编译 Apache Tuscany 代码。你需要安装Maven。目前,代码库可以与Maven 2.0.5正常工作。有人也曾使用更高版本成功编译,但是如果你遇到问题,则请尝试使用2.0.5。
[编辑] 为什么我下载的 Tuscany 代码无法编译? |
如果你从Tuscany的SVN代码库检出了最新的代码。那你可能有些不幸,因为当时的代码可能正处于排错状态。由于trunk代码是各方开发者都在共同合作开发的地方。所以这类情况会时常发生,但是开发者们同时也会努力尽快排除问题。
另一些问题也会导致无法编译。一个很有价值的信息源就是邮件列表。我们可能会给出以下建议:
停止你正在使用的某种IDE 检出最新的修订版
cd mytuscanydir svn checkout https://svn.apache.org/repos/asf/incubator/tuscany/java/
或者(如果你已经有了某个版本的代码)
svn update https://svn.apache.org/repos/asf/incubator/tuscany/java/
清空所有的maven项目
cd mytuscanydir/sca mvn clean
删除或重命名maven本地类库目录,以清除maven的本地类库中清除所有的SCA的文件。
.m2\repository\org\apache\tuscany\sca
重新编译sca
cd mytuscanydir/sca mvn
如果仍然不能编译。那就请您到邮件列表上发一封邮件吧。
[编辑] 编译过程出现Java Heap 错误? |
在运行到itest的时候,我总是看到一个"Java heap space"错误,但是如果在itest目录下编译,则可以通过,而在定级目录则不行。
试试"MAVEN_OPTS="-Xmx1024m -Xms512m",或者你可以在sca的pom文件中提高surfire plugin部分的内存配给1
1+ https://svn.apache.org/repos/asf/incubator/tuscany/java/sca/pom.xml
[编辑] 如何从下载的代码生成 Eclipse 项目 ? |
如果你解压了下载的源码包,或者检出了svn库,你会看到如下的目录结构:
demos distribution itest modules samples tools pom.xml
你可以用maven编译代码
mvn
你还可以用以下命令从每个模块编译Eclipse项目
mvn -Peclipse eclipse:eclipse
这将为每个模块生成".classpath" 和 ".project" 文件。最简单的方法就是用Eclipse输入这些项目。在Eclipse里面,使用"File/Import/Existing Projects Into Workspace"。在向导里面,选择你的代码目录,Eclipse将会发现各个生成的项目。
如果你输入所有的模块。你会发现工作区内的各个项目间的依赖关系已经设定好了。这样为你在调试和跟踪代码时,带来了很多便利。
[编辑] 如何从下载的WebApp示例代码生成 Eclipse WTP 项目? |
如果你正在使用Eclipse WTP,并且想从WebApp例子中得到一个WTP Web项目。你只要在mvn eclipse:eclipse 命令后面多给一个参数 -Dwtpversion=1.5
mvn -Dwtpversion=1.5 -Peclipse eclipse:eclipse
神奇 -Dwtpversion=1.5 参数将会为每个Eclipse项目增加 WTP Web项目属性。如 <packaging>war</packaging> 。接下来,你便可以将这些项目增加到WTP Tomcat 或 Geronimo Server 配置中, 直接在Eclipse工作区中运行这些项目代码。
[编辑] 使用IBM JDK I运行WSConfidentialityTestCase 时,出现java.lang.ExceptionInInitializerError arising from the base java.security.InvalidKeyException: Public key presented not for certificate signature - 如何克服这种现象? |
解决这个问题,请到IBM JDK的 jre\lib\security\java.security文件中增加安全设定:如下
# # List of providers and their preference orders: # security.provider.1=org.bouncycastle.jce.provider.BouncyCastleProvider security.provider.3=com.ibm.jsse2.IBMJSSEProvider2 security.provider.2=com.ibm.crypto.provider.IBMJCE security.provider.4=com.ibm.security.jgss.IBMJGSSProvider security.provider.5=com.ibm.security.cert.IBMCertPath security.provider.6=com.ibm.security.sasl.IBMSASL
[编辑] maven依赖的类库没有公布之前,如何运行RC版本中的示例程序? |
二进制版里面的例子在我们在maven在线类库中发布其依赖资源之前,是无法编译的。为了完成测试,你可以暂时在maven settings.xml中增加一个镜像设置做法如下:
<mirrors>
<mirror>
<id>ant.staging</id>
<url>http://people.apache.org/~antelder/tuscany/1.0-RC1a/maven</url>
<mirrorOf>apache.incubator</mirrorOf>
</mirror>
</mirrors>
settings.xml位于你的home目录中的.m2子目录下,比如,我的就是在 : "C:\Documents and Settings\Administrator\.m2". 如果你没有找到,我们这里有一个例子: settings.xml
[编辑] 如何打开更多的运行时输出? |
Tuscany使用JDK logger 输出info, warning 等. 输出多少内容由logging.properties文件控制. Tuscany代码中没有提供这个文件,因为它使用JDK设定缺省的INFO级别的输出。如果你想设置这个级别,则请创建一个logging.properties文件,或者修改当前的jre/lib下面的那个。如,在IBM JDK中:
C:\thedirwhereiinstalledjava\jre\lib\logging properties
你想将输出级别设置为FINE,以得到更多参考信息,则请
.level= FINE
或者在屏幕上获得更多输出
java.util.logging.ConsoleHandler.level = INFO参考这里 有有关JDK日至的设定的文档。
[编辑] 如何使用Eclipse远程调试 Tuscany Java SCA 应用? |
这里有很多有关如何开启java远程调试的文档:这里有一个
简单讲:就是让JVM在一个端口上输出调试信息。例如:调试Calculator例子的时候
java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 -cp ..\..\lib\tuscany-sca-manifest.jar;target\sample-calculator.jar;.calculator.CalculatorClient Listenin for transport dt_socket at address: 8000 3 + 2=5.0 3 - 2=1.0 3 * 2=6.0 3 / 2=1.5
重要的一点是参数中的-X. 注意地址设在端口8000. 在 Eclipse 中,你需要简单地打开调试对话框(debug dialog)并创建一个新的"Remote Java Application",并设定端口8000。以配合上面的命令。
假设你已经在Eclipse中开始使用 Tuscany SCA 源码,你就可以开始调试calculator例子了。
[编辑] 为什么Maven在变异过程中上锁? |
简言之,我们也不知道。但是我们有时也在windows上遇到这种问题,并且曾经回溯到与其他应用程序之间的冲突。所以首要的措施就是停止计算机上的其他应用程序,然后再尝试一下,看看是否能够通过。
[编辑] Java 实现问题
[编辑] 如何用 @Service 注释标记多个接口? |
@Service(interfaces={Interface1.class, Interface2.class, Interface3.class} )
public class ServiceImpl implements Interface1, Interface2, Interface3{
...
}
[编辑] 为什么引用(references)没有被注入到我的构件中? |
如果你已经象这样实现了一个构件...
public class ServiceImpl implements ServiceInterface1{
@Reference
ServiceInterface2 serviceReference1;
@Reference
private ServiceInterface2 serviceReference2;
@Reference
protected ServiceInterface2 serviceReference3;
@Reference
public ServiceInterface2 serviceReference4;
...
}
则你会在运行时发现serviceReference1 和 serviceReference2 都是 null,这是因为 SCA 只能“注入” protected 或 public 类型的成员。这对于其他“注入”型注释也是一样的。如@Callback, @ConversationId 和 @Context.
[编辑] 绑定的问题
[编辑] SCA 构件能否被发布为一个无状态EJB? |
不幸的是,我们目前只支持从SCA调用SLSB,我们欢迎任何这方面的贡献。
[编辑] 数据绑定问题
[编辑] 逻辑类型与物理类型之间的区别? |
逻辑类型是指那些在链接服务时所传递的数据类型。这可以是Java 类型, XML 类型, 以及CORBA 类型, 它们是在服务组装过程中使用的服务接口。而物理类型指的是运行时的实际类型。在Java环境中,它们一定是一个Java对象,有时它们会是与逻辑类型相同的类型。如一个Java构件通过Java接口本地调用另一个Java构件的时候,其逻辑类型和物理类型就是相同的。很多情况下,他们是不同的,例如,服务接口是WSDL,则逻辑类型则是WSDL所定义的XML类型。运行时相同的逻辑类型,有着很多不同的物理类型。例如, 同一个XML文档可能表现为DOM, StAX 流,SDO, 或 JAXB 对象,也可能是一个AXIOM流。Tuscany支持各种物理类型之间的转换。
数据中介拦截(data mediator interceptor)是做什么用的? 你能说一说当具有引用R的构件A在使用具有服务S的构件B的时候,中介是如何工作的?
- 拦截器是由联结对象添加的。 A的外联于B的内联描述了他们所支持的数据类型。当联结建立的时候,如果需要类型转换,则会增加拦截器。
传输绑定的一项任务就是:转换一个内存中的二进制地址,并用于网络(序列化和反序列化)。我们重用了一些成功的传输方案如 Axis2 或 RMI. 这样,我们就需要在内部联结的时候转换物理类型。例如Axis2只接受AXIOM,所以在引用的时候我们需要转换用户的一个 AXIOM 的物理类型,而在服务端,我们需要将传输过来的AXIOM转换为用户实现所需要的类型,该过程描述如下:
- A 通过物理Java 对象 X(java)引用 R
- X 被放入 R的外联
- 数据中介将 X(java) 转换为 AXIOM 对象 X(axiom)
- X(axiom) 被放入Axis2绑定的内联
- Axis2绑定将 X(axiom)序列化(XML格式)到网络上
- 目标Axis2绑定将来自网络的 XML 反序列化为 X(axiom)
- X(axiom) 被放入Axis2绑定的外联
- 数据中介按照目标构件的需要将 X(axiom) 转换为 X(java)
- X(java) 被放入 B的内联
- B的目标实例被调用时,得到传入的 X(java)
一个重要的事情: 从结构上看我们将要处理两个物理联结: 客户端(源构件A)联结到Axis2外联传输,服务端则联接Axis2内联传输到目标构件B。
从全局角度考虑,只有一个逻辑联结从 A 到 B,但是由于A 和 B 可能位于两个运行时,所以逻辑联结被分解为两个物理联结。 A->net 和 net->B.
[编辑] Contribution问题
[编辑] META-INF/sca-contribution.xml是干什么用的? |
SCA 组装模型标准 1.00 版 在第1.10.2.3.节描述了这个文件,sca-contribution.xml中所描述的任何组件,都会被自动纳入到可发布资源列表
如果你在目录中有一个contribution
/my/contribution/dir
则所有的组件与该目录下的其他资源都将被列入contribution服务. 例如, 如果我们有
/my/contribution/dir/META-INF/sca-contribution.xml /my/contribution/dir/mycomposite.composite
sca-contribution.xml内容:
<contribution xmlns="http://www.osoa.org/xmlns/sca/1.0" targetNamespace="http://mycomposite" xmlns:management="http://mycomposite"> <deployable composite="mycomposite:MyComposite"/> </contribution>
则contribution服务会寻找mycomposite.composite 和他所包含的一个叫做 mycomposite:MyComposite的组件, 然后发布他们。
[编辑] META-INF/sca-deployables/ 是干什么用的? |
这是一个Tuscany自定的发布构件的方式, SCA标准并未提出这个做法。
如果你在某个目录有一个contribution
/my/contribution/dir
则所该目录下的有组件、构件都将列入发布服务。/META-INF/sca-deployables/ 将被自动发布。例如
/my/contribution/dir/META-INF/sca-deployables/mycomposite.composite
[编辑] 标准中的问题
[编辑] Tuscany 所实现的标准在哪里? |
SCA 技术委员会共有6个:
- http://www.oasis-open.org/committees/tc_home.php?wg_abbrev=sca-assembly
- http://www.oasis-open.org/committees/tc_home.php?wg_abbrev=sca-policy
- http://www.oasis-open.org/committees/tc_home.php?wg_abbrev=sca-bindings
- http://www.oasis-open.org/committees/tc_home.php?wg_abbrev=sca-j
- http://www.oasis-open.org/committees/tc_home.php?wg_abbrev=sca-c-cpp
- http://www.oasis-open.org/committees/tc_home.php?wg_abbrev=sca-bpel
会议时间,文档,以及事件都在这几个链接里面。
邮件列表如下:
- http://www.oasis-open.org/archives/sca-assembly/
- http://www.oasis-open.org/archives/sca-policy/
- http://www.oasis-open.org/archives/sca-bindings/
- http://www.oasis-open.org/archives/sca-j/
- http://www.oasis-open.org/archives/sca-c-cpp/
- http://www.oasis-open.org/archives/sca-bpel/
[编辑] 策略(Policy)方面的问题
[编辑] Tuscany 1.0版本支持哪个级别的策略 ? |
Java SCA 1.0版本, 一个SCA 域的策略意图和策略组可以在 definitions.xml 文件中定义。以及在每个SCA组件描述文件中分别描述。With respect to processing, computing aplicable policies and applying them is concerned here is what the Release 1.0版本支持:
- 可用的策略组用于绑定元素。也就是说:只支持交互策略。下一个版本将会支持实现元素上的策略
- 策略定义的附件,如axis2配置参数。例如在binding-ws-axis2中有几个itest,例子中也有一个 helloworld-ws-service-secure,也使用了与ws-security有关的策略。
- itest 和例子中并没有实现“confidentiality intent”,原因是法律条款问题。 Tuscany尊重相关加密API的开发者的知识产权。
- 支持WS-Policy附件, 但是不支持声明型策略
- 在判断策略是否可用于某个sca元素的时候,在'appliesTo'属性中使用xpath表达式还不能被处理,因为我们正在整理 有关的标准,以及相关的实现 - http://www.mail-archive.com/tuscany-dev%40ws.apache.org/msg21699.html
[编辑] 如何在我的Web服务绑定中使用'confidentiality'策略 ? |
- 首先,你必须确保你已经获得了bouncycastle的法律许可. 该组织持有诸多与加密有关的专利 (如 IDEA)。
- 接下来,你必须熟悉如何给Axis2设置加密。这里有一些相关的链接 http://wso2.org/library/234, http://wso2.org/library/174, http://wso2.org/library/255.
- 在 ws-binding-axis2模块的itest和 helloworld-ws-service-secure示例中,definitions.xml 文件已经定义了与加密(confidentiality)相关的策略 修改Axis2ConfigParam策略附件中的值,以配合你在自己的应用中使用的配置,如keystore, 访问keystore所需的用户名和密码, 以及password callback handler 类等
- 现在,设置你可以在binding.ws元素上设置加密了。类库bcprov-jdk15-132.jar必须在classpath上。
- 有些JRE可能需要修改一些security.policy 中的设置。以处理一些加密提供商。我们在Sun和IBM的JRE里面都成功通过 了测试。

