小编lja*_*der的帖子

为什么CXF/JAXB在编组到SOAP消息之前将整个InputStream读入内存

信息 - 示例代码

我已经为您设置了示例代码(SSCCE)来帮助跟踪问题:

https://github.com/ljader/test-cxf-base64-marshall

问题

我正在与第三方JAX-WS服务集成,因此我无法更改 WSDL.

第三方Web服务期望Base64编码的字节对它们执行某些操作 - 它们期望客户端在SOAP消息中发送整个字节.他们不想改为MTOM/XOP,所以我坚持当前的要求.

我决定使用CXF轻松设置示例客户端,它适用于小文件.

但是当我尝试发送大数据,即200MB时,CXF/JAXB会抛出异常:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at com.sun.xml.bind.v2.util.ByteArrayOutputStreamEx.readFrom(ByteArrayOutputStreamEx.java:75)
at com.sun.xml.bind.v2.runtime.unmarshaller.Base64Data.get(Base64Data.java:196)
at com.sun.xml.bind.v2.runtime.unmarshaller.Base64Data.writeTo(Base64Data.java:312)
at com.sun.xml.bind.v2.runtime.output.UTF8XmlOutput.text(UTF8XmlOutput.java:312)
at com.sun.xml.bind.v2.runtime.XMLSerializer.leafElement(XMLSerializer.java:356)
at com.sun.xml.bind.v2.model.impl.RuntimeBuiltinLeafInfoImpl$PcdataImpl.writeLeafElement(RuntimeBuiltinLeafInfoImpl.java:191)
at com.sun.xml.bind.v2.runtime.MimeTypedTransducer.writeLeafElement(MimeTypedTransducer.java:96)
at com.sun.xml.bind.v2.runtime.reflect.TransducedAccessor$CompositeTransducedAccessorImpl.writeLeafElement(TransducedAccessor.java:254)
at com.sun.xml.bind.v2.runtime.property.SingleElementLeafProperty.serializeBody(SingleElementLeafProperty.java:130)
at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:360)
at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:696)
at com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl$1.serializeBody(ElementBeanInfoImpl.java:155)
at com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl$1.serializeBody(ElementBeanInfoImpl.java:130)
at com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl.serializeBody(ElementBeanInfoImpl.java:332)
at com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl.serializeRoot(ElementBeanInfoImpl.java:339)
at com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl.serializeRoot(ElementBeanInfoImpl.java:75)
at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsRoot(XMLSerializer.java:494)
at com.sun.xml.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:323)
at com.sun.xml.bind.v2.runtime.MarshallerImpl.marshal(MarshallerImpl.java:251)
at javax.xml.bind.helpers.AbstractMarshallerImpl.marshal(AbstractMarshallerImpl.java:95)
at org.apache.cxf.jaxb.JAXBEncoderDecoder.writeObject(JAXBEncoderDecoder.java:617)
at org.apache.cxf.jaxb.JAXBEncoderDecoder.marshall(JAXBEncoderDecoder.java:241)
at org.apache.cxf.jaxb.io.DataWriterImpl.write(DataWriterImpl.java:237)
at org.apache.cxf.interceptor.AbstractOutDatabindingInterceptor.writeParts(AbstractOutDatabindingInterceptor.java:117)
at org.apache.cxf.wsdl.interceptors.BareOutInterceptor.handleMessage(BareOutInterceptor.java:68)
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:308)
at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:514) …
Run Code Online (Sandbox Code Playgroud)

cxf jax-ws jaxb marshalling jaxb2

10
推荐指数
1
解决办法
2189
查看次数

覆盖android gradle versionCode表单命令行

我有一个build.gradle文件在我的Android应用程序中使用此设置:

android {
    ...
    defaultConfig {
        applicationId "some.app.id"
        versionName '1.2'
        versionCode 3
        ...
    }
...
}
Run Code Online (Sandbox Code Playgroud)

我的AndroidManifest.xml 包含versionCode,也不包含versionName.

现在我想在Jenkins上构建这个应用程序并将BUILD_NUMBER作为app的versionCode传递,以便每个构建都有更高的版本.

所以在工作中我有一个电话:

./gradlew -PversionCode=$BUILD_NUMBER clean build
Run Code Online (Sandbox Code Playgroud)

当我使用"versionCode"重命名"app-release.apk"时,versionCode的值与从命令行传递的值相同:

applicationVariants.all { variant ->
    variant.outputs.each { output ->
        output.outputFile = new File(output.outputFile.parent, output.outputFile.name.replace("app-release.apk", "MyApp_" + "_v" + versionName + "." + versionCode + ".apk"))
    }
}
Run Code Online (Sandbox Code Playgroud)

摘要

所以我将默认值"versionCode"设置为3,但是在构建Jenkins时我想从命令行覆盖它.

问题

问题是在AndroidManifest内部构建.apk应用程序将versionCode设置为3而不是BUILD_NUMBER的值.我用"aapt dump badging"检查了它

这个问题

可以通过命令行参数覆盖android defaultConfig中的这个值"versionCode"吗?

我知道,我可以使用如下所述的函数:http: //robertomurray.co.uk/blog/2013/gradle-android-inject-version-code-from-command-line-parameter/ 但我更喜欢清洁方式简单的覆盖,但我不能让它工作.

android gradle jenkins android-gradle-plugin

7
推荐指数
1
解决办法
4863
查看次数