搭建开发环境
参考资料
- 主要参考了这个系列,因此文档开头特别感谢一下https://blog.csdn.net/xiangshangdemayi/article/details/122441730
- 添加依赖的参考文档https://blog.csdn.net/qq_15065903/article/details/128781051
- maven仓库https://mvnrepository.com/artifact/javax.xml.soap/javax.xml.soap-api
0、基础环境准备
0.1、idea
我使用的是2023.3.5
0.2、jdk
部门的工程主要使用的是jdk1.8,geoserver2.24.x源码使用的是jdk11以上。所以需要安装一下jdk11。我使用的是OpenLogic的OpenJDK,以前用Oracle的openjdk还得登录,所以没有用Oracle的。
ps:
各个openjdk版本资源列表:https://jdk.java.net/archive/
写这篇文档的时候才发现这个网页。囊括了几乎所有维护中的版本。比较友好。提供的文件是编译好的,下载后不用配置,放到固定位置即可(个人推荐c:/java/openjdk11)
0.3、源码
公司当前使用的是geoserver-cloud 2.24.2.因此选用了2.24.x这个分支
1、导入工程
代码下载好之后按提示打开工程,然后切换到2.24.x分支
idea自动检测maven工程。安装提示窗,load即可
识别完成后,确认每个模块的jdk版本。右键任意一个模块名称,如:src[geoserver] 。选择右键后弹出菜单中的 Open Module Settings。
确保每个module的jdk都是11以上
2、配置启动环境
2.1、打开新增配置面板
添加配置
2.2、配置工作目录
2.2.1、从常用配置中选择
把默认目录删除,保证working directory框里只有$MODEL_DIR $ 复制的时候记得把第二个$ 符号之前的空格删除(暂时不知道怎么在MarkDown中打出两个$$夹内容)
2.2.2、直接粘贴
直接向working directory框里输入$MODEL_DIR $
复制的时候记得把第二个$ 符号之前的空格删除(暂时不知道怎么在MarkDown中打出两个$$夹内容)
2.3最终效果
总共需要保证五处都改好了。
注:
如果Working directory没设置好,可能会报4.4错误
参考文档中的errorprone问题没有遇到,我直接安装了这个插件。就不补充了
3、调整源码
3.1、添加maven引用
源码中有个类缺少Node引用。编译的时候报错,点击报错的提示,定位到源码文件的工程。在pom.xml中添加maven依赖
文件目录:src/wcs1_1/pom.xml
yaml
<!-- https://mvnrepository.com/artifact/javax.xml.soap/javax.xml.soap-api -->
<dependency>
<groupId>javax.xml.soap</groupId>
<artifactId>javax.xml.soap-api</artifactId>
<version>1.4.0</version>
</dependency>
代码添加引用
源文件相对目录:src/wcs1_1/src/main/java/org/geoserver/wcs/kvp/rangesubset/AbstractContentNode.java
java
package org.geoserver.wcs.kvp.rangesubset;
import javax.xml.soap.Node;
public abstract class AbstractContentNode implements Node {
protected String content;
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
3.2、注释无效代码
需要修改的源文件(相对目录)src/wcs1_1/src/main/java/org/geoserver/wcs/kvp/RangeSubsetKvpParser.java
文件注释后的结果
java
/* (c) 2014 Open Source Geospatial Foundation - all rights reserved
* (c) 2001 - 2013 OpenPlans
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geoserver.wcs.kvp;
import static org.vfny.geoserver.wcs.WcsException.WcsExceptionCode.InvalidParameterValue;
import java.io.StringReader;
import net.opengis.ows11.CodeType;
import net.opengis.ows11.Ows11Factory;
import net.opengis.wcs11.AxisSubsetType;
import net.opengis.wcs11.FieldSubsetType;
import net.opengis.wcs11.RangeSubsetType;
import net.opengis.wcs11.Wcs111Factory;
import org.geoserver.ows.KvpParser;
//import org.geoserver.wcs.kvp.rangesubset.ASTAxisId;
//import org.geoserver.wcs.kvp.rangesubset.ASTAxisSubset;
//import org.geoserver.wcs.kvp.rangesubset.ASTFieldId;
//import org.geoserver.wcs.kvp.rangesubset.ASTFieldSubset;
//import org.geoserver.wcs.kvp.rangesubset.ASTInterpolation;
//import org.geoserver.wcs.kvp.rangesubset.ASTKey;
//import org.geoserver.wcs.kvp.rangesubset.ASTRangeSubset;
//import org.geoserver.wcs.kvp.rangesubset.Node;
//import org.geoserver.wcs.kvp.rangesubset.RangeSubsetParser;
//import org.geoserver.wcs.kvp.rangesubset.RangeSubsetParserVisitor;
//import org.geoserver.wcs.kvp.rangesubset.SimpleNode;
import org.vfny.geoserver.wcs.WcsException;
/**
* Parses the RangeSubset parameter of a GetFeature KVP request
*
* @author Andrea Aime
*/
public class RangeSubsetKvpParser extends KvpParser {
public RangeSubsetKvpParser() {
super("RangeSubset", RangeSubsetType.class);
}
@Override
public Object parse(String value) throws Exception {
return null;
/* RangeSubsetParser parser = new RangeSubsetParser(new StringReader(value));
SimpleNode root = parser.RangeSubset();
RangeSubsetType result =
(RangeSubsetType) root.jjtAccept(new RangeSubsetKvpParserVisitor(), null);
for (Object o : result.getFieldSubset()) {
FieldSubsetType type = (FieldSubsetType) o;
String interpolationType = type.getInterpolationType();
if (interpolationType != null) {
try {
InterpolationMethod.valueOf(interpolationType);
} catch (IllegalArgumentException e) {
throw new WcsException(
"Unknown interpolation method " + interpolationType,
InvalidParameterValue,
"RangeSubset");
}
}
}
return result;*/
}
/* private static class RangeSubsetKvpParserVisitor implements RangeSubsetParserVisitor {
Wcs111Factory wcsf = Wcs111Factory.eINSTANCE;
Ows11Factory owsf = Ows11Factory.eINSTANCE;
@Override
public Object visit(SimpleNode node, Object data) {
throw new UnsupportedOperationException("This method should never be reached");
}
@Override
@SuppressWarnings("unchecked") // EMF model without generics
public Object visit(ASTRangeSubset node, Object data) {
RangeSubsetType rs = wcsf.createRangeSubsetType();
for (int i = 0; i < node.jjtGetNumChildren(); i++) {
ASTFieldSubset fs = (ASTFieldSubset) node.jjtGetChild(i);
FieldSubsetType fst = (FieldSubsetType) fs.jjtAccept(this, data);
rs.getFieldSubset().add(fst);
}
return rs;
}
@Override
@SuppressWarnings("unchecked") // EMF model without generics
public Object visit(ASTFieldSubset node, Object data) {
FieldSubsetType fs = wcsf.createFieldSubsetType();
for (int i = 0; i < node.jjtGetNumChildren(); i++) {
Node child = node.jjtGetChild(i);
if (child instanceof ASTFieldId) {
CodeType id = owsf.createCodeType();
id.setValue((String) child.jjtAccept(this, null));
fs.setIdentifier(id);
} else if (child instanceof ASTInterpolation) {
fs.setInterpolationType((String) child.jjtAccept(this, null));
} else if (child instanceof ASTAxisSubset) {
fs.getAxisSubset().add(child.jjtAccept(this, null));
}
}
return fs;
}
@Override
@SuppressWarnings("unchecked") // EMF model without generics
public Object visit(ASTAxisSubset node, Object data) {
AxisSubsetType as = wcsf.createAxisSubsetType();
as.setIdentifier(((SimpleNode) node.jjtGetChild(0)).getContent());
for (int i = 1; i < node.jjtGetNumChildren(); i++) {
as.getKey().add(node.jjtGetChild(i).jjtAccept(this, null));
}
return as;
}
@Override
public Object visit(ASTFieldId node, Object data) {
return node.getContent();
}
@Override
public Object visit(ASTAxisId node, Object data) {
return node.getContent();
}
@Override
public Object visit(ASTInterpolation node, Object data) {
return node.getContent();
}
@Override
public Object visit(ASTKey node, Object data) {
return node.getContent();
}
}*/
}
3.3、删除测试代码
做好以上处理后,我启动时测试代码报错,提示找不到文件。为了快速启动,直接把测试代码删掉了。猜测是我没有配置测试环境
4、修改运行端口
4.1、直接修改启动类中的端口设置
找了半天才找到启动类的位置,是个测试类,相对路径:src/web/app/src/test/java/org/geoserver/web/Start.java
直接修改启动类的端口就可以了,我改成了8010
能正常启动
4.2、修改jetty配置
我下载的这个pom文件里引用jetty组件异常,所以pom里面设置的端口号没起效果。我只用了上边那种方式,直接在启动类修改了端口