
我使用的是Maven Project,所以
1。第一步加入Maven Dependency。
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-server</artifactId>
<version>1.10</version>
</dependency>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-client</artifactId>
<version>1.10</version>
</dependency>
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>2.4.1</version>
</dependency>
2。 然后,加入ant plugin来帮助我们产生protobuf 的java bean。
<build>
<plugins>
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<id>generate-sources</id>
<phase>generate-sources</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<tasks>
<mkdir dir='target/generated-sources' />
<exec executable='protoc'>
<arg value='--java_out=target/generated-sources' />
<arg value='src/main/resources/addressbook.proto' />
</exec>
</tasks>
<sourceRoot>target/generated-sources</sourceRoot>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
<pluginManagement>
<plugins>
<!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.-->
<plugin>
<groupId>org.eclipse.m2e</groupId>
<artifactId>lifecycle-mapping</artifactId>
<version>1.0.0</version>
<configuration>
<lifecycleMappingMetadata>
<pluginExecutions>
<pluginExecution>
<pluginExecutionFilter>
<groupId>
org.apache.maven.plugins
</groupId>
<artifactId>
maven-antrun-plugin
</artifactId>
<versionRange>[1.3,)</versionRange>
<goals>
<goal>run</goal>
</goals>
</pluginExecutionFilter>
<action>
<ignore></ignore>
</action>
</pluginExecution>
</pluginExecutions>
</lifecycleMappingMetadata>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
3。 创建addressbook.proto文件
package tutorial
option java_package = "com.sampullara.jaxrsprotobuf.tutorial"
option java_outer_classname = "AddressBookProtos"
message Person {
required string name = 1
required int32 id = 2
optional string email = 3
enum PhoneType {
MOBILE = 0
HOME = 1
WORK = 2
}
message PhoneNumber {
required string number = 1
optional PhoneType type = 2 [default = HOME]
}
repeated PhoneNumber phone = 4
}
message AddressBook {
repeated Person person = 1
}
4。 运行mvn generate-sources命令来生成AddressBookProtos.java文件。
5。创建rest server端代码AddressBookService.java
package com.sampullara
import javax.ws.rs.Consumes
import javax.ws.rs.GET
import javax.ws.rs.POST
import javax.ws.rs.Path
import javax.ws.rs.Produces
import com.sampullara.jaxrsprotobuf.tutorial.AddressBookProtos
@Path("/person")
public class AddressBookService {
@GET
@Produces("application/x-protobuf")
public AddressBookProtos.Person getPerson() {
return AddressBookProtos.Person.newBuilder()
.setId(1)
.setName("Sam")
.setEmail("sam@sampullara.com")
.addPhone(AddressBookProtos.Person.PhoneNumber.newBuilder()
.setNumber("415-555-1212")
.setType(AddressBookProtos.Person.PhoneType.MOBILE)
.build())
.build()
}
@POST
@Consumes("application/x-protobuf")
@Produces("application/x-protobuf")
public AddressBookProtos.Person reflect(AddressBookProtos.Person person) {
return person
}
}
6。创建ProtobufProviders.java文件处理protobuf对象序列化。
package com.sampullara
import com.google.protobuf.GeneratedMessage
import com.google.protobuf.Message
import javax.ws.rs.Consumes
import javax.ws.rs.Produces
import javax.ws.rs.WebApplicationException
import javax.ws.rs.core.MediaType
import javax.ws.rs.core.MultivaluedMap
import javax.ws.rs.ext.MessageBodyReader
import javax.ws.rs.ext.MessageBodyWriter
import javax.ws.rs.ext.Provider
import java.io.ByteArrayOutputStream
import java.io.IOException
import java.io.InputStream
import java.io.OutputStream
import java.lang.annotation.Annotation
import java.lang.reflect.Method
import java.lang.reflect.Type
import java.util.Map
import java.util.WeakHashMap
某一天把spring-boot从1.3.6版本升级到1.4.3版本,然后在使用 java -jar uber.jar 运行启动项目的时候会出现
的异常
springboot 1.5.2
jersey 2.25.1
spring-boot升级到1.4+ 以后,spring-boot专门用来打包的maven plugin对目录结构进行了改变,如果使用了jersey来代替springmvc作为restful的方案,然后并且自己在生成的JerseyConfig类里面,通过 package() 函数来指定要扫描的包的路径的话,会导致找不到对应的路径,从而导致了出现 java.io.FileNotFoundException 的异常
网上一搜, 果然有很多相关的提问, 其中官方网站的升级wiki里面,也说了这个问题,并且给出了解决方案:
http://docs.spring.io/spring-boot/docs/1.5.x/reference/htmlsingle/#howto-extract-specific-libraries-when-an-executable-jar-runs
但是,按照这个方案进行配置,修改了相关的jar的坐标,但是没有效果(可能是我配置错误,如果有人知道如何通过配置,麻烦告知,十分感谢)
然后没有办法,只能找其他的解决方案
既然是 package() 函数来指定扫描包的时候找不到对应的路径,那就替换这个方法,最终使用了
来替换了传统的 package() 的方式,然后打包、运行。 可以看到项目成功启动了,并且简单的接口也可以访问了。
不过接下来需要进一步验证是否能在其他环境正常运行。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)