我的身旁是一扇亮了又暗的窗

0%

让一个Eclipse项目在Idea上跑起来

今天是项目的环境搭建和初始化项目(就是让一个项目跑起来)

原来项目的环境是

  • Java 环境:jdk1.8
  • 数据库:Sql Server2008
  • 开发环境:Eclipse

需要转移的是

  • 数据库:本机上搭建
  • 开发环境:IDEA

第一步:把 Eclipse 的项目替换到 IDEA

导入项目

直接open flie or preject
image.png
选中你要导入的项目
直接导入就好了
导入的时候可能会提示没有当前的 jdk 版本
不管他

设置项目

下一步设置项目中必要的东西
image.png
下面就是一些要更改的地方

当前系统的 JDK 版本

image.png

设置运行环境

image.png

1 设置 JDK
2、3、4 直接删除

加载 bin

找到WebContent\WEB-INF\lib把全部的 jar 包导入到项目里面

加载 Web

image.png
选中项目,点击 web 的位置,找到 WebContent 选中,然后点击右下角的CREATE ARTIFACT
image.png
然后APPLY

Build

选着也是 Build
image.png

第一个问题出现了

image.png
Build 后并没有通过出现了个奇怪的错误
找到文件后发现第一个位置并有显示的问题
解决办法没遇到过也想不到方法百度

开始解决

找到设置
image.png
找到 Settings-> Build,Execution… -> Compiler -> Java Compiler 把 javac修改成Eclipse,保存,再 Build 一下
image.png

新问题

image.png
这个问题应该是前面处理的时候遗留下来的
这时候找找原因看看

解决新问题

  1. 原因是eclipse和idea对同样编码utf-8的细节不一致,一个有 BOM,一个没有。

  2. 什么是 BOM 呢?

    BOM 的全称是:Byte Order Mark(字节顺序标记)。UTF-8以字节为编码单元,没有字节序的问题。UTF-16 以两个字节为编码单元,在解析一个 UTF-16 文本前,首先要弄清楚每个编码单元的字节序。例如:收到一个“奎”的 Unicode 编码是 594E,“乙”的 Unicode 编码是 4E59。如果我们收到 UTF-16 字节流“594E”,那么这是“奎”还是“乙”?
    Unicode规范中推荐的标记字节顺序的方法是BOM。BOM 不是“Bill Of Material”的 BOM 表,而是 Byte Order Mark(字节顺序标记)。在 UCS 编码中有一个叫做”ZERO WIDTH NO-BREAK SPACE”的字符,它的编码是 FEFF。而 FFFE 在 UCS 中是不存在的字符,所以不应该出现在实际传输中。UCS 规范建议我们在传输字节流前,先传输字符”ZERO WIDTH NO-BREAK SPACE”。这样如果接收者收到 FEFF,就表明这个字节流是 Big-Endian 的;如果收到 FFFE,就表明这个字节流是 Little-Endian 的。因此字符”ZERO WIDTH NO-BREAK SPACE”又被称作 BOM。

  3. UTF-8不需要BOM来表明字节顺序,但可以用BOM来表明编码方式。字符”ZERO WIDTH NO-BREAK SPACE”的 UTF-8 编码是 EF BB BF。所以如果接收者收到以 EF BB BF 开头的字节流,就知道这是 UTF-8 编码了。

  4. 通过UE查看文件的16进制形式,发现开头包含 EF BB BF 串,eclipse不对其做识别而作为普通的字符处理,因此报错

解决方法如下:

  1. 使用 UE 或者其他文本工具,将有问题的 java 文件另存为 UTF-8,无 BOM 编码的格式,替换原来的 java 文件。
  2. 使用 eclipse 自建的文件编码,尽量不要从其他地方拷贝代码,手写要复制的代码。

这两个毫无疑问都需要手动,一两个类就算了,这个项目少说都有一百多个类
如果我不想原地去世就要想想别的办法,Java 嘛,应该有代码能解决

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
import java.io.*;
import java.util.ArrayList;
import java.util.List;

public class Test extends Reader {
private static final int BOM_SIZE = 4;
PushbackInputStream internalIn;//回退流对象
InputStreamReader internalIn2 = null;
String defaultEnc;//格式
/**
* @param in inputstream to be read
* @param defaultEnc default encoding if stream does not have
* BOM marker. Give NULL to use system-level default.
*/
Test(InputStream in, String defaultEnc) {
internalIn = new PushbackInputStream(in, BOM_SIZE);
this.defaultEnc = defaultEnc;
}

private static void readContentAndSaveWithEncoding(String filePath, String readEncoding, String saveEncoding) throws Exception {
saveContent(filePath, readContent(filePath, readEncoding), saveEncoding);
}

private static void saveContent(String filePath, String content, String encoding) throws Exception {
FileOutputStream fos = new FileOutputStream(filePath);
OutputStreamWriter w = new OutputStreamWriter(fos, encoding);
w.write(content);
w.flush();
}

private static String readContent(String filePath, String encoding) throws Exception {
FileInputStream file = new FileInputStream(new File(filePath));
BufferedReader br = new BufferedReader(new Test(file, encoding));
String line = null;
String fileContent = "";
while ((line = br.readLine()) != null) {
fileContent = fileContent + line;
fileContent += "\r\n";
}
return fileContent;
}

private static List<String> getPerlineFileName(String filePath) throws Exception {
FileInputStream file = new FileInputStream(new File(filePath));
BufferedReader br = new BufferedReader(new InputStreamReader(file, "UTF-8"));
String line = null;
List<String> list = new ArrayList<String>();
while ((line = br.readLine()) != null) {
list.add(line);
}
return list;
}

/**
* 获取某个目录下所有的文件路径
* 使用递归
* @param filePath
* @param filePaths
* @return
*/
private static List<String> getAllFilePaths(File filePath, List<String> filePaths) {
File[] files = filePath.listFiles();
if (files == null) {
return filePaths;
}
for (File f : files) {
if (f.isDirectory()) {
filePaths.add(f.getPath());
getAllFilePaths(f, filePaths);
} else {
filePaths.add(f.getPath());
}
}
return filePaths;
}

public static void main(String[] args) throws Exception {
String suffix = ".java";
List<String> paths = new ArrayList<String>();
paths = getAllFilePaths(new File("src的路径"), paths);
List<String> pathList = new ArrayList<String>();
for (String path : paths) {
if (path.endsWith(suffix)) {
pathList.add(path);
}
}
for (String path : pathList) {
readContentAndSaveWithEncoding(path, "UTF-8", "UTF-8");
System.out.println(path + "转换成功");
}
}

public String getDefaultEncoding() {
return defaultEnc;
}

/**
* Get stream encoding or NULL if stream is uninitialized.
* Call init() or read() method to initialize it.
*/
public String getEncoding() {
if (internalIn2 == null) return null;
return internalIn2.getEncoding();
}

/**
* Read-ahead four bytes and check for BOM marks. Extra bytes are
* unread back to the stream, only BOM bytes are skipped.
*/
protected void init() throws IOException {
if (internalIn2 != null) return;
String encoding;
byte bom[] = new byte[BOM_SIZE];
int n, unread;
n = internalIn.read(bom, 0, bom.length);
if ((bom[0] == (byte) 0x00) && (bom[1] == (byte) 0x00) &&
(bom[2] == (byte) 0xFE) && (bom[3] == (byte) 0xFF)) {
encoding = "UTF-32BE";
unread = n - 4;
} else if ((bom[0] == (byte) 0xFF) && (bom[1] == (byte) 0xFE) &&
(bom[2] == (byte) 0x00) && (bom[3] == (byte) 0x00)) {
encoding = "UTF-32LE";
unread = n - 4;
} else if ((bom[0] == (byte) 0xEF) && (bom[1] == (byte) 0xBB) &&
(bom[2] == (byte) 0xBF)) {
encoding = "UTF-8";
unread = n - 3;
} else if ((bom[0] == (byte) 0xFE) && (bom[1] == (byte) 0xFF)) {
encoding = "UTF-16BE";
unread = n - 2;
} else if ((bom[0] == (byte) 0xFF) && (bom[1] == (byte) 0xFE)) {
encoding = "UTF-16LE";
unread = n - 2;
} else {
// Unicode BOM mark not found, unread all bytes
encoding = defaultEnc;
unread = n;
}
//System.out.println("read=" + n + ", unread=" + unread);
if (unread > 0) internalIn.unread(bom, (n - unread), unread);
// Use given encoding
if (encoding == null) {
internalIn2 = new InputStreamReader(internalIn);
} else {
internalIn2 = new InputStreamReader(internalIn, encoding);
}
}

public void close() throws IOException {
init();
internalIn2.close();
}

public int read(char[] cbuf, int off, int len) throws IOException {
init();
return internalIn2.read(cbuf, off, len);
}
}

代码有了下一步直接运行就好了哈哈哈(当时确实是这么想的)
首先不能放到….
算了直接编译算了
javac Test.java -encoding utf-8
成功
java Test
失败
嗯,失败
嗯?失败?

第三个问题

javac 没问题 java 运行失败
不用想环境变量的问题
找一下是那个龟孙出的问题
image.png
这个就是这个
把 java 的环境上移到这个上面
image.png
解决

下面就是
运行(这个没问题)
创建 Tomecat(这个没问题)

VM 安装 Sql Server(细说)

下一步下一步的安装就不说了

第一个:远程访问

(一)首先是要检查 SQLServer 数据库服务器中是否允许远程链接。其具体操作为:
(1)打开数据库,用本地帐户登录,右击第一个选项,选择属性:

(2)在打开的属性窗口,在其右边点击“连接”,然后再左侧勾上“允许远程连接到此服务器”:

(二)为微软 SQL 服务器(MSSQLServer)配置相应协议。
(1)依次选择:开始-〉所有程序-〉Microsoft SQL Server 2008-〉配置工具-〉SQL Server 配置管理器,如下图所示:

(2)打开 SQL Server 配置管理器后,选择 SQL Server 网络配置下面的 MSSQLSERVER,然后看右边里面的 TCP/IP 是否为“已启用”,如下图所示:

(三)检查 SQL 服务器防火墙设置 (快捷步骤-直接关闭防火墙(不安全))
(1)在进行完上两步操作后,用户需要做的是对 SQL 服务器防火墙进行重新配置。在进行这一步操作时,首先找到 SQL 服务器上那个端口支持 TCP/IP 协议。用户可以在 SQL 服务器防火墙已经处于运行状态下,右击“TCP/IP 协议”选择“属性”:

从上图中我们可以看出,这台 SQL 服务器上支持 TCP/IP 协议的是 1433 端口。下一步要做的是在防火墙的配置中允许 1433 端口支持 TCP/IP 协议即可。如果服务器上运行的是 Windows 7 操作系统,其配置步骤为(其他微软操作系统的做法类似),打开“控制面板”选择“Windows 防火墙”选项,然后点击高级选项,如下图所示:

(2)选择“高级设置”后,在右边菜单栏中找出“具有高级安全选项的 Windows 防火墙”并将其打开。打开后会发现在左边菜单栏中有“入站规则(Inboud Rules)”选项。将该选项打开,并在右边菜单栏中选择“新建规则(New Rule)”选项:

(3)打开“新建规则”选项后,利用“新内置绑定规则向导”为 1433 端口配置“内部绑定协议”配置为适用于 TCP/IP 协议即可。(前提是,需要完成该步骤以前所述的所有步骤),根据下面的几幅图为 1433 端口配置适用于 1433 端口即可:





最后点击“完成”即可。
最后的最后记得重启 SqlServer,要不不会生效
net stop mssqlserver
net start mssqlserver

第二个:数据库还原

第一种

数据库上右击,选择还原文件和文件组

image.png

选择目标数据库,选择 bak 文件,确定即可还原数据库

image.png
一般情况下这样就可以还原数据库了,但有时会报一个错

出现这种情况,就说明第一种方式不能还原数据库了
接下来用第二种方式即可

第二种

在数据库里用代码直接还原

1
2
3
4
5
6
7
8
9
ALTER DATABASE [数据库名] SET OFFLINE WITH ROLLBACK IMMEDIATE  --断开其他用户与数据库的连接
USE MASTER --这里注意要使用MASTER,以免出现待还原库被占用的情况
RESTORE DATABASE [数据库名] --为待还原库名
FROM DISK = 'C:\xxx.bak' ---备份文件名
WITH MOVE '数据库名' TO 'C:\bakeup\数据库名.mdf', ---指定数据文件路径
MOVE '数据库名_LOG' TO 'C:\bakeup\数据库名_log.ldf', ---指定日志文件路径
STATS = 10, REPLACE
GO
ALTER database [数据库名] set online