信息 - 示例代码
我已经为您设置了示例代码(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) 我有一个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/ 但我更喜欢清洁方式简单的覆盖,但我不能让它工作.