diff --git a/o2server/pom.xml b/o2server/pom.xml
index 0293e4525b570a629de51526b854b0eada813446..ec5d2e8793f2846c9a3c6cb21bd93be82fbd8f4e 100644
--- a/o2server/pom.xml
+++ b/o2server/pom.xml
@@ -366,6 +366,10 @@
com.github.whvcse
easy-captcha
+
+ org.apache.hadoop
+ hadoop-client
+
@@ -410,7 +414,7 @@
-
org.eclipse.m2e
@@ -854,7 +858,7 @@
javapoet
1.11.1
-
com.github.neuroph
@@ -886,7 +890,7 @@
slf4j-api
1.7.25
-
com.alibaba
@@ -1093,6 +1097,11 @@
easy-captcha
1.6.2
+
+ org.apache.hadoop
+ hadoop-client
+ 3.3.1
+
diff --git a/o2server/x_base_core_project/src/main/java/com/x/base/core/entity/StorageObject.java b/o2server/x_base_core_project/src/main/java/com/x/base/core/entity/StorageObject.java
index 46d530744dab3a19b566e539959c10f3db49c578..6841b8c80a9b43bc1cd69a9e34a186494eb8f0e0 100644
--- a/o2server/x_base_core_project/src/main/java/com/x/base/core/entity/StorageObject.java
+++ b/o2server/x_base_core_project/src/main/java/com/x/base/core/entity/StorageObject.java
@@ -2,8 +2,10 @@ package com.x.base.core.entity;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
+import java.io.FileNotFoundException;
import java.io.InputStream;
import java.io.OutputStream;
+import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.Date;
import java.util.Objects;
@@ -33,18 +35,18 @@ import com.x.base.core.project.tools.DefaultCharset;
@MappedSuperclass
public abstract class StorageObject extends SliceJpaObject {
- private static FileSystemManager FILESYSTEMANAGERINSTANCE;
+ private static FileSystemManager fileSystemManagerInstance;
- private synchronized FileSystemManager getFileSystemManager() throws Exception {
- if (FILESYSTEMANAGERINSTANCE == null) {
+ private synchronized FileSystemManager getFileSystemManager() throws FileSystemException {
+ if (fileSystemManagerInstance == null) {
StandardFileSystemManager fs = new StandardFileSystemManager();
fs.setFilesCache(new NullFilesCache());
fs.setCacheStrategy(CacheStrategy.ON_RESOLVE);
fs.init();
- FILESYSTEMANAGERINSTANCE = fs;
+ fileSystemManagerInstance = fs;
}
- return FILESYSTEMANAGERINSTANCE;
+ return fileSystemManagerInstance;
}
private static final long serialVersionUID = 7823729771901802653L;
@@ -53,33 +55,35 @@ public abstract class StorageObject extends SliceJpaObject {
public static final String DELETE_OPERATE = "delete";
- abstract public String path() throws Exception;
+ public abstract String path() throws Exception;
- abstract public String getStorage();
+ public abstract String getStorage();
- abstract public void setStorage(String storage);
+ public abstract void setStorage(String storage);
- abstract public Long getLength();
+ public abstract Long getLength();
- abstract public void setLength(Long length);
+ public abstract void setLength(Long length);
- abstract public String getName();
+ public abstract String getName();
- abstract public void setName(String name);
+ public abstract void setName(String name);
- abstract public String getExtension();
+ public abstract String getExtension();
- abstract public void setExtension(String extension);
+ public abstract void setExtension(String extension);
- abstract public Date getLastUpdateTime();
+ public abstract Date getLastUpdateTime();
- abstract public void setLastUpdateTime(Date lastUpdateTime);
+ public abstract void setLastUpdateTime(Date lastUpdateTime);
- abstract public Boolean getDeepPath();
+ public abstract Boolean getDeepPath();
- abstract public void setDeepPath(Boolean deepPath);
+ public abstract void setDeepPath(Boolean deepPath);
- public String path(String operate) throws Exception { return this.path();}
+ public String path(String operate) throws Exception {
+ return this.path();
+ }
@Transient
private byte[] bytes;
@@ -148,14 +152,24 @@ public abstract class StorageObject extends SliceJpaObject {
/** 更新Content内容 */
public Long updateContent(StorageMapping mapping, byte[] bytes) throws Exception {
- long length = -1L;
- FileSystemManager manager = this.getFileSystemManager();
+
+ if (Objects.equals(StorageProtocol.hdfs, mapping.getProtocol())) {
+ return this.hdfsUpdateContent(mapping, bytes);
+ } else {
+ return this.vfsUpdateContent(mapping, bytes);
+ }
+
+ }
+
+ private Long vfsUpdateContent(StorageMapping mapping, byte[] bytes) throws Exception {
String prefix = this.getPrefix(mapping);
String path = this.path();
if (StringUtils.isEmpty(path)) {
- throw new Exception("path can not be empty.");
+ throw new IllegalStateException("path can not be empty.");
}
FileSystemOptions options = this.getOptions(mapping);
+ long length = -1L;
+ FileSystemManager manager = this.getFileSystemManager();
/*
* 需要进行两次判断,在前端使用nginx分发的情况下,可能同时触发多个文件的上传,多个文件同时上传可能会同时创建文件的存储目录,会在后台导致错误
* org.apache.commons.vfs2.FileSystemException: Could not create folder
@@ -185,6 +199,23 @@ public abstract class StorageObject extends SliceJpaObject {
return length;
}
+ private long hdfsUpdateContent(StorageMapping mapping, byte[] bytes) throws Exception {
+ try (org.apache.hadoop.fs.FileSystem fileSystem = org.apache.hadoop.fs.FileSystem
+ .get(hdfsConfiguration(mapping))) {
+ org.apache.hadoop.fs.Path path = new org.apache.hadoop.fs.Path(getPrefix(mapping), this.path());
+ if (fileSystem.exists(path)) {
+ fileSystem.delete(path, false);
+ }
+ try (org.apache.hadoop.fs.FSDataOutputStream out = fileSystem.create(path)) {
+ out.write(bytes);
+ this.setStorage(mapping.getName());
+ this.setLastUpdateTime(new Date());
+ this.setLength((long) bytes.length);
+ }
+ }
+ return bytes.length;
+ }
+
/** 读出内容 */
public byte[] readContent(StorageMapping mapping) throws Exception {
try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
@@ -195,6 +226,15 @@ public abstract class StorageObject extends SliceJpaObject {
/** 将内容流出到output */
public Long readContent(StorageMapping mapping, OutputStream output) throws Exception {
+ if (Objects.equals(mapping.getProtocol(), StorageProtocol.hdfs)) {
+ return hdfsReadContent(mapping, output);
+ } else {
+ return vfsReadContent(mapping, output);
+ }
+ }
+
+ // vfs读取数据
+ private Long vfsReadContent(StorageMapping mapping, OutputStream output) throws Exception {
long length = -1L;
FileSystemManager manager = this.getFileSystemManager();
String prefix = this.getPrefix(mapping);
@@ -206,9 +246,9 @@ public abstract class StorageObject extends SliceJpaObject {
length = IOUtils.copyLarge(input, output);
}
} else {
- throw new Exception(fo.getPublicURIString() + " not existed, object:" + this.toString() + ".");
+ throw new FileNotFoundException(
+ fo.getPublicURIString() + " not existed, object:" + this.toString() + ".");
}
- // manager.closeFileSystem(fo.getFileSystem());
if (!Objects.equals(StorageProtocol.webdav, mapping.getProtocol())) {
/* webdav关闭会试图去关闭commons.httpClient */
manager.closeFileSystem(fo.getFileSystem());
@@ -217,22 +257,74 @@ public abstract class StorageObject extends SliceJpaObject {
return length;
}
+ // hadoop读取数据
+ private Long hdfsReadContent(StorageMapping mapping, OutputStream output) throws Exception {
+ long length = -1L;
+ try (org.apache.hadoop.fs.FileSystem fileSystem = org.apache.hadoop.fs.FileSystem
+ .get(hdfsConfiguration(mapping))) {
+ org.apache.hadoop.fs.Path path = new org.apache.hadoop.fs.Path(getPrefix(mapping), this.path());
+ if (fileSystem.exists(path)) {
+ try (org.apache.hadoop.fs.FSDataInputStream inputStream = fileSystem.open(path)) {
+ length = IOUtils.copyLarge(inputStream, output);
+ }
+ } else {
+ throw new FileNotFoundException(path + " not existed, object:" + this.toString() + ".");
+ }
+ }
+ return length;
+ }
+
/** 检查是否存在内容 */
public boolean existContent(StorageMapping mapping) throws Exception {
+ if (Objects.equals(mapping.getProtocol(), StorageProtocol.hdfs)) {
+ return hdfsExistContent(mapping);
+ } else {
+ return vfsExistContent(mapping);
+ }
+ }
+
+ private boolean vfsExistContent(StorageMapping mapping) throws Exception {
FileSystemManager manager = this.getFileSystemManager();
String prefix = this.getPrefix(mapping);
String path = this.path();
FileSystemOptions options = this.getOptions(mapping);
try (FileObject fo = manager.resolveFile(prefix + PATHSEPARATOR + path, options)) {
- if (fo.exists() && fo.isFile()) {
- return true;
+ return (fo.exists() && fo.isFile());
+ }
+ }
+
+ private boolean hdfsExistContent(StorageMapping mapping) throws Exception {
+ try (org.apache.hadoop.fs.FileSystem fileSystem = org.apache.hadoop.fs.FileSystem
+ .get(hdfsConfiguration(mapping))) {
+ org.apache.hadoop.fs.Path path = fileSystem.getHomeDirectory();
+ if (StringUtils.isNotEmpty(mapping.getPrefix())) {
+ path = new org.apache.hadoop.fs.Path(path, mapping.getPrefix());
}
- return false;
+ path = new org.apache.hadoop.fs.Path(path, this.path());
+ return fileSystem.exists(path);
}
}
- /** 删除内容,同时判断上一级目录(只判断一级)是否为空,为空则删除上一级目录 */
public void deleteContent(StorageMapping mapping) throws Exception {
+ if (Objects.equals(mapping.getProtocol(), StorageProtocol.hdfs)) {
+ hdfsDeleteContent(mapping);
+ } else {
+ vfsDeleteContent(mapping);
+ }
+ }
+
+ private void hdfsDeleteContent(StorageMapping mapping) throws Exception {
+ try (org.apache.hadoop.fs.FileSystem fileSystem = org.apache.hadoop.fs.FileSystem
+ .get(hdfsConfiguration(mapping))) {
+ org.apache.hadoop.fs.Path path = new org.apache.hadoop.fs.Path(getPrefix(mapping), this.path());
+ if (fileSystem.exists(path)) {
+ fileSystem.delete(path, false);
+ }
+ }
+ }
+
+ // 删除内容,同时判断上一级目录(只判断一级)是否为空,为空则删除上一级目录
+ private void vfsDeleteContent(StorageMapping mapping) throws Exception {
FileSystemManager manager = this.getFileSystemManager();
String prefix = this.getPrefix(mapping);
String path = this.path(DELETE_OPERATE);
@@ -242,64 +334,57 @@ public abstract class StorageObject extends SliceJpaObject {
fo.delete();
if ((!StringUtils.startsWith(path, PATHSEPARATOR)) && (StringUtils.contains(path, PATHSEPARATOR))) {
FileObject parent = fo.getParent();
- if ((null != parent) && parent.exists() && parent.isFolder()) {
- if (parent.getChildren().length == 0) {
- parent.delete();
- }
+ if ((null != parent) && parent.exists() && parent.isFolder()
+ && (parent.getChildren().length == 0)) {
+ parent.delete();
}
}
}
- // manager.closeFileSystem(fo.getFileSystem());
if (!Objects.equals(StorageProtocol.webdav, mapping.getProtocol())) {
- /* webdav关闭会试图去关闭commons.httpClient */
+ // webdav关闭会试图去关闭commons.httpClient
manager.closeFileSystem(fo.getFileSystem());
}
}
}
- /* 取得完整访问路径的前半部分 */
- private String getPrefix(StorageMapping mapping) throws Exception {
+ // 取得完整访问路径的前半部分
+ private String getPrefix(StorageMapping mapping) throws IllegalStateException, UnsupportedEncodingException {
String prefix = "";
if (null == mapping.getProtocol()) {
- throw new Exception("storage protocol is null.");
+ throw new IllegalStateException("storage protocol is null.");
}
switch (mapping.getProtocol()) {
- // bzip2,file, ftp, ftps, gzip, hdfs, http, https, jar, ram, res, sftp,
- // tar, temp, webdav, zip, cifs, mime;
case ftp:
- // ftp://[ username[: password]@] hostname[: port][ relative-path]
prefix = "ftp://" + URLEncoder.encode(mapping.getUsername(), DefaultCharset.name) + ":"
+ URLEncoder.encode(mapping.getPassword(), DefaultCharset.name) + "@" + mapping.getHost() + ":"
+ mapping.getPort();
break;
case ftps:
- // ftps://[ username[: password]@] hostname[: port][ relative-path]
prefix = "ftps://" + URLEncoder.encode(mapping.getUsername(), DefaultCharset.name) + ":"
+ URLEncoder.encode(mapping.getPassword(), DefaultCharset.name) + "@" + mapping.getHost() + ":"
+ mapping.getPort();
break;
case sftp:
- // ftps://[ username[: password]@] hostname[: port][ relative-path]
prefix = "sftp://" + URLEncoder.encode(mapping.getUsername(), DefaultCharset.name) + ":"
+ URLEncoder.encode(mapping.getPassword(), DefaultCharset.name) + "@" + mapping.getHost() + ":"
+ mapping.getPort();
break;
case cifs:
- // smb://[ username[: password]@] hostname[: port][ absolute-path]
prefix = "smb://" + URLEncoder.encode(mapping.getUsername(), DefaultCharset.name) + ":"
+ URLEncoder.encode(mapping.getPassword(), DefaultCharset.name) + "@" + mapping.getHost() + ":"
+ mapping.getPort();
break;
case webdav:
- // webdav://[ username[: password]@] hostname[: port][ absolute-path]
prefix = "webdav://" + URLEncoder.encode(mapping.getUsername(), DefaultCharset.name) + ":"
+ URLEncoder.encode(mapping.getPassword(), DefaultCharset.name) + "@" + mapping.getHost() + ":"
+ mapping.getPort();
break;
case file:
- // [file://] absolute-path
prefix = "file://";
break;
+ case hdfs:
+ // 路径不采用带用户名的homeDirctory,直接返回
+ return StringUtils.isEmpty(mapping.getPrefix()) ? "/" : ("/" + mapping.getPrefix());
default:
break;
}
@@ -309,11 +394,9 @@ public abstract class StorageObject extends SliceJpaObject {
private FileSystemOptions getOptions(StorageMapping mapping) throws Exception {
FileSystemOptions opts = new FileSystemOptions();
if (null == mapping.getProtocol()) {
- throw new Exception("storage protocol is null.");
+ throw new IllegalStateException("storage protocol is null.");
}
switch (mapping.getProtocol()) {
- // bzip2,file, ftp, ftps, gzip, hdfs, http, https, jar, ram, res, sftp,
- // tar, temp, webdav, zip, cifs, mime;
case sftp:
FtpFileSystemConfigBuilder sftpBuilder = FtpFileSystemConfigBuilder.getInstance();
sftpBuilder.setPassiveMode(opts, Config.vfs().getSftp().getPassive());
@@ -341,9 +424,10 @@ public abstract class StorageObject extends SliceJpaObject {
* java.net.Socket.connect(Socket.java:589)
*/
ftpBuilder.setPassiveMode(opts, Config.vfs().getFtp().getPassive());
- // builder.setPassiveMode(opts, false);
- // builder.setPassiveMode(opts, true);
- /** 强制不校验IP */
+ /*
+ * builder.setPassiveMode(opts, false);
+ */
+ // 强制不校验IP
ftpBuilder.setRemoteVerification(opts, false);
// FtpFileType.BINARY is the default
ftpBuilder.setFileType(opts, FtpFileType.BINARY);
@@ -354,7 +438,7 @@ public abstract class StorageObject extends SliceJpaObject {
case ftps:
FtpsFileSystemConfigBuilder ftpsBuilder = FtpsFileSystemConfigBuilder.getInstance();
ftpsBuilder.setPassiveMode(opts, Config.vfs().getFtp().getPassive());
- /** 强制不校验IP */
+ // 强制不校验IP
ftpsBuilder.setRemoteVerification(opts, false);
// FtpFileType.BINARY is the default
ftpsBuilder.setFileType(opts, FtpFileType.BINARY);
@@ -373,7 +457,6 @@ public abstract class StorageObject extends SliceJpaObject {
webdavBuilder.setMaxConnectionsPerHost(opts, 200);
webdavBuilder.setMaxTotalConnections(opts, 200);
webdavBuilder.setFollowRedirect(opts, true);
- // webdavBuilder.setVersioning(opts, true);
break;
case file:
break;
@@ -383,4 +466,16 @@ public abstract class StorageObject extends SliceJpaObject {
return opts;
}
+ private org.apache.hadoop.conf.Configuration hdfsConfiguration(StorageMapping mapping) {
+ if ((!StringUtils.equals(System.getProperty("HADOOP_USER_NAME"), mapping.getUsername()))
+ && StringUtils.isNotBlank(mapping.getUsername())) {
+ System.setProperty("HADOOP_USER_NAME", mapping.getUsername());
+ }
+ org.apache.hadoop.conf.Configuration configuration = new org.apache.hadoop.conf.Configuration();
+ configuration.set("fs.default.name",
+ StorageProtocol.hdfs + "://" + mapping.getHost() + ":" + mapping.getPort());
+ configuration.set("fs.hdfs.impl", "org.apache.hadoop.hdfs.DistributedFileSystem");
+ return configuration;
+ }
+
}
diff --git a/o2server/x_base_core_project/src/main/java/com/x/base/core/entity/StorageProtocol.java b/o2server/x_base_core_project/src/main/java/com/x/base/core/entity/StorageProtocol.java
index 257d95355d4555594140e8a2fa87f0a1e5a91a78..e0ece7bbf36138c6ecf1b3144495794b2511ec49 100644
--- a/o2server/x_base_core_project/src/main/java/com/x/base/core/entity/StorageProtocol.java
+++ b/o2server/x_base_core_project/src/main/java/com/x/base/core/entity/StorageProtocol.java
@@ -1,7 +1,7 @@
package com.x.base.core.entity;
public enum StorageProtocol {
- ftp, ftps, webdav, cifs, file, sftp;
+ ftp, ftps, webdav, cifs, file, sftp, hdfs;
public static final int length = JpaObject.length_16B;
}
diff --git a/o2server/x_base_core_project/src/main/java/com/x/base/core/project/config/Config.java b/o2server/x_base_core_project/src/main/java/com/x/base/core/project/config/Config.java
index 399d0141293043c3b299fe4511c33cf894de6286..70b951734dfe6c80527e2110dab96e59a667f943 100644
--- a/o2server/x_base_core_project/src/main/java/com/x/base/core/project/config/Config.java
+++ b/o2server/x_base_core_project/src/main/java/com/x/base/core/project/config/Config.java
@@ -106,6 +106,14 @@ public class Config {
public static final String DIR_COMMONS_EXT = "commons/ext";
public static final String DIR_COMMONS_LANGUAGE = "commons/language";
public static final String DIR_COMMONS_FONTS = "commons/fonts";
+ public static final String DIR_COMMONS_HADOOP = DIR_COMMONS + "/hadoop";
+ public static final String DIR_COMMONS_HADOOP_WINDOWS = DIR_COMMONS_HADOOP + "/" + OS_WINDOWS;
+ public static final String DIR_COMMONS_HADOOP_AIX = DIR_COMMONS + "/ " + OS_AIX;
+ public static final String DIR_COMMONS_HADOOP_LINUX = DIR_COMMONS + "/" + OS_LINUX;
+ public static final String DIR_COMMONS_HADOOP_MACOS = DIR_COMMONS + "/" + OS_MACOS;
+ public static final String DIR_COMMONS_HADOOP_RASPI = DIR_COMMONS + "/" + OS_RASPI;
+ public static final String DIR_COMMONS_HADOOP_ARM = DIR_COMMONS + "/" + OS_ARM;
+ public static final String DIR_COMMONS_HADOOP_MIPS = DIR_COMMONS + "/" + OS_MIPS;
public static final String DIR_CONFIG = "config";
public static final String DIR_CONFIG_COVERTOWEBSERVER = "config/coverToWebServer";
public static final String DIR_CONFIGSAMPLE = "configSample";
@@ -114,11 +122,11 @@ public class Config {
public static final String DIR_DYNAMIC = "dynamic";
public static final String DIR_DYNAMIC_JARS = "dynamic/jars";
public static final String DIR_JVM = "jvm";
- public static final String DIR_JVM_AIX = "jvm/aix";
- public static final String DIR_JVM_LINUX = "jvm/linux";
- public static final String DIR_JVM_MACOS = "jvm/macos";
- public static final String DIR_JVM_WINDOWS = "jvm/windows";
- public static final String DIR_JVM_NEOKYLIN_LOONGSON = "jvm/neokylin_loongson";
+// public static final String DIR_JVM_AIX = "jvm/aix";
+// public static final String DIR_JVM_LINUX = "jvm/linux";
+// public static final String DIR_JVM_MACOS = "jvm/macos";
+// public static final String DIR_JVM_WINDOWS = "jvm/windows";
+// public static final String DIR_JVM_NEOKYLIN_LOONGSON = "jvm/neokylin_loongson";
public static final String DIR_LOCAL = "local";
public static final String DIR_LOCAL_BACKUP = "local/backup";
public static final String DIR_LOCAL_UPDATE = "local/update";
@@ -1339,4 +1347,116 @@ public class Config {
initialContext().rebind(RESOURCE_NODE_PROCESSPLATFORMEXECUTORS, executorServices);
}
+ public static boolean isWindowsJava8() throws Exception {
+ return command_java_path().startsWith(dir_jvm().toPath().resolve(OS_WINDOWS));
+ }
+
+ public static boolean isLinuxJava8() throws Exception {
+ return command_java_path().startsWith(dir_jvm().toPath().resolve(OS_LINUX));
+ }
+
+ public static boolean isRaspiJava8() throws Exception {
+ return command_java_path().startsWith(dir_jvm().toPath().resolve(OS_RASPI));
+ }
+
+ public static boolean isArmJava8() throws Exception {
+ return command_java_path().startsWith(dir_jvm().toPath().resolve(OS_ARM));
+ }
+
+ public static boolean isMipsJava8() throws Exception {
+ return command_java_path().startsWith(dir_jvm().toPath().resolve(OS_MIPS));
+ }
+
+ public static boolean isAixJava8() throws Exception {
+ return command_java_path().startsWith(dir_jvm().toPath().resolve(OS_AIX));
+ }
+
+ public static boolean isMacosJava8() throws Exception {
+ return command_java_path().startsWith(dir_jvm().toPath().resolve(OS_MACOS));
+ }
+
+ public static boolean isWindowsJava11() throws Exception {
+ return command_java_path().startsWith(dir_jvm().toPath().resolve(OS_WINDOWS + "_" + JAVAVERSION_JAVA11));
+ }
+
+ public static boolean isLinuxJava11() throws Exception {
+ return command_java_path().startsWith(dir_jvm().toPath().resolve(OS_LINUX + "_" + JAVAVERSION_JAVA11));
+ }
+
+ public static boolean isRaspiJava11() throws Exception {
+ return command_java_path().startsWith(dir_jvm().toPath().resolve(OS_RASPI + "_" + JAVAVERSION_JAVA11));
+ }
+
+ public static boolean isArmJava11() throws Exception {
+ return command_java_path().startsWith(dir_jvm().toPath().resolve(OS_ARM + "_" + JAVAVERSION_JAVA11));
+ }
+
+ public static boolean isMipsJava11() throws Exception {
+ return command_java_path().startsWith(dir_jvm().toPath().resolve(OS_MIPS + "_" + JAVAVERSION_JAVA11));
+ }
+
+ public static boolean isAixJava11() throws Exception {
+ return command_java_path().startsWith(dir_jvm().toPath().resolve(OS_AIX + "_" + JAVAVERSION_JAVA11));
+ }
+
+ public static boolean isMacosJava11() throws Exception {
+ return command_java_path().startsWith(dir_jvm().toPath().resolve(OS_MACOS + "_" + JAVAVERSION_JAVA11));
+ }
+
+ public static Path path_commons_hadoop_windows(boolean force) throws Exception {
+ Path path = Paths.get(base(), DIR_COMMONS_HADOOP_WINDOWS);
+ if ((!Files.exists(path)) && force) {
+ Files.createDirectories(path);
+ }
+ return path;
+ }
+
+ public static Path path_commons_hadoop_linux(boolean force) throws Exception {
+ Path path = Paths.get(base(), DIR_COMMONS_HADOOP_LINUX);
+ if ((!Files.exists(path)) && force) {
+ Files.createDirectories(path);
+ }
+ return path;
+ }
+
+ public static Path path_commons_hadoop_aix(boolean force) throws Exception {
+ Path path = Paths.get(base(), DIR_COMMONS_HADOOP_AIX);
+ if ((!Files.exists(path)) && force) {
+ Files.createDirectories(path);
+ }
+ return path;
+ }
+
+ public static Path path_commons_hadoop_macos(boolean force) throws Exception {
+ Path path = Paths.get(base(), DIR_COMMONS_HADOOP_MACOS);
+ if ((!Files.exists(path)) && force) {
+ Files.createDirectories(path);
+ }
+ return path;
+ }
+
+ public static Path path_commons_hadoop_raspi(boolean force) throws Exception {
+ Path path = Paths.get(base(), DIR_COMMONS_HADOOP_RASPI);
+ if ((!Files.exists(path)) && force) {
+ Files.createDirectories(path);
+ }
+ return path;
+ }
+
+ public static Path path_commons_hadoop_arm(boolean force) throws Exception {
+ Path path = Paths.get(base(), DIR_COMMONS_HADOOP_ARM);
+ if ((!Files.exists(path)) && force) {
+ Files.createDirectories(path);
+ }
+ return path;
+ }
+
+ public static Path path_commons_hadoop_mips(boolean force) throws Exception {
+ Path path = Paths.get(base(), DIR_COMMONS_HADOOP_MIPS);
+ if ((!Files.exists(path)) && force) {
+ Files.createDirectories(path);
+ }
+ return path;
+ }
+
}
diff --git a/o2server/x_base_core_project/src/main/java/com/x/base/core/project/config/ExternalStorageSource.java b/o2server/x_base_core_project/src/main/java/com/x/base/core/project/config/ExternalStorageSource.java
index 8319e295f68040b63076e5ded062ca8e0e51ab89..4bee64ee1876247131c8abbf7c72c119e06f51c2 100644
--- a/o2server/x_base_core_project/src/main/java/com/x/base/core/project/config/ExternalStorageSource.java
+++ b/o2server/x_base_core_project/src/main/java/com/x/base/core/project/config/ExternalStorageSource.java
@@ -9,20 +9,22 @@ import com.x.base.core.project.tools.Crypto;
public class ExternalStorageSource extends ConfigObject {
+ private static final long serialVersionUID = 5926439816241094368L;
+
// 无需保存
private transient String _password;
public ExternalStorageSource() {
- this.protocol = default_protocol;
- this.username = default_username;
- this.password = default_password;
- this.host = default_host;
- this.port = default_port;
- this.prefix = default_prefix;
- this.enable = default_enable;
- this.weight = default_weight;
- this.name = default_name;
- this.deepPath = default_deepPath;
+ this.protocol = DEFAULT_PROTOCOL;
+ this.username = DEFAULT_USERNAME;
+ this.password = DEFAULT_PASSWORD;
+ this.host = DEFAULT_HOST;
+ this.port = DEFAULT_PORT;
+ this.prefix = DEFAULT_PREFIX;
+ this.enable = DEFAULT_ENABLE;
+ this.weight = DEFAULT_WEIGHT;
+ this.name = DEFAULT_NAME;
+ this.deepPath = DEFAULT_DEEPPATH;
}
public static ExternalStorageSource defaultInstance() {
@@ -30,18 +32,18 @@ public class ExternalStorageSource extends ConfigObject {
}
- public static final StorageProtocol default_protocol = StorageProtocol.webdav;
- public static final String default_username = "admin";
- public static final String default_password = "admin";
- public static final String default_host = "127.0.0.1";
- public static final Integer default_port = 8080;
- public static final String default_prefix = "";
- public static final Integer default_weight = 100;
- public static final Boolean default_enable = true;
- public static final String default_name = "251";
- public static final Boolean default_deepPath = false;
-
- @FieldDescribe("协议,可选值ftp,webdav")
+ public static final StorageProtocol DEFAULT_PROTOCOL = StorageProtocol.webdav;
+ public static final String DEFAULT_USERNAME = "admin";
+ public static final String DEFAULT_PASSWORD = "admin";
+ public static final String DEFAULT_HOST = "127.0.0.1";
+ public static final Integer DEFAULT_PORT = 8080;
+ public static final String DEFAULT_PREFIX = "";
+ public static final Integer DEFAULT_WEIGHT = 100;
+ public static final Boolean DEFAULT_ENABLE = true;
+ public static final String DEFAULT_NAME = "251";
+ public static final Boolean DEFAULT_DEEPPATH = false;
+
+ @FieldDescribe("协议,可选值ftp,webdav...")
private StorageProtocol protocol;
@FieldDescribe("登录用户名.")
private String username;
diff --git a/o2server/x_console/src/main/java/com/x/server/console/Hadoop.java b/o2server/x_console/src/main/java/com/x/server/console/Hadoop.java
new file mode 100644
index 0000000000000000000000000000000000000000..dfa5cf349bfce7c52d54a578570e8a888a4cc840
--- /dev/null
+++ b/o2server/x_console/src/main/java/com/x/server/console/Hadoop.java
@@ -0,0 +1,32 @@
+package com.x.server.console;
+
+import java.util.Iterator;
+import java.util.Map.Entry;
+import java.util.Properties;
+
+import com.x.base.core.project.config.Config;
+
+public class Hadoop {
+
+ private Hadoop() {
+ // nothing
+ }
+
+ public static void init() throws Exception {
+ setHomeDir();
+ }
+
+ private static void setHomeDir() throws Exception {
+ if (Config.isWindowsJava11()) {
+ System.setProperty("hadoop.home.dir", Config.path_commons_hadoop_windows(false).toString());
+ // [qtp680227777-226] WARN org.apache.hadoop.util.NativeCodeLoader - Unable to
+ // load native-hadoop library for your platform... using builtin-java classes
+ // where applicable
+ // System.setProperty("log4j.logger.org.apache.hadoop.util.NativeCodeLoader",
+ // "ERROR");
+ System.setProperty("java.library.path", Config.path_commons_hadoop_windows(false).resolve("bin").toString()
+ + System.getProperty("path.separator") + System.getProperty("java.library.path"));
+ }
+ }
+
+}
diff --git a/o2server/x_console/src/main/java/com/x/server/console/Main.java b/o2server/x_console/src/main/java/com/x/server/console/Main.java
index 7ab2db1795148cffcc167bf113ae5a5c42501662..abac6e4d62605f29661cabb0078e69b1f8bdc7f7 100644
--- a/o2server/x_console/src/main/java/com/x/server/console/Main.java
+++ b/o2server/x_console/src/main/java/com/x/server/console/Main.java
@@ -109,6 +109,8 @@ public class Main {
LogTools.setSlf4jSimple();
ResourceFactory.bind();
CommandFactory.printStartHelp();
+ // 初始化hadoop环境
+ Hadoop.init();
}
public static void main(String[] args) throws Exception {