165543337
本帖最后由 165543337 于 2018-2-20 09:09 编辑
7 z$ T! W# c9 U& q4 o# T9 w' K0 I8 V- \3 m1 _8 a
1.复制,构建和编译Spigot源代码
8 R5 x4 e2 j4 y4 a
9 ^* Y# X2 G: s0 G7 g获得Spigot的源码以成功进行开发工作8 T; V; x  m6 |3 y
3 J1 \3 X: j7 C$ f; h+ f
6 o' Z9 O. C/ n* K4 G4 V, A! T
内容+ V2 g! z  T5 Z' b( o$ B
前提条件
+ y  H% P. I, G2 l1 Y! @获取源代码1 m4 `& h; _3 V: p
构建spigot/ Y: i+ C2 v3 B
创建一个用于提交或本地使用的补丁文件

0 F* Y8 T$ [  ^2 j2 M* S6 ?; P! F0 l. R4 y$ |) a8 I
前提条件(顶部)
+ T) G0 x" z. Q# \1 d7 O拥有基础Git知识
6 R9 I: H& ?9 p5 B3 i一个基于Unix的系统或一个bash解释器(比如Cygwin,Git Bash等)4 f3 u0 `* ?  m2 ^2 j! k; q
Maven 3.0.5与路径设置
  W6 g7 g4 \/ q2 y. }# z1 j/ Y9 o9 v( E
获取源代码(顶部)
+ h$ x2 A- T! c! X- X7 W  q首先,从复制Spigot源码开始。如果你想创建一个分支,你需要在JIRA上创建一个账户。填写SpigotMC CLA并等待24小时以激活您的Stash账户。请确保您的用户名和电子邮件地址相符。一旦您的账户被激活,请使用您的JIRA凭证登录到Stash。然后,您可以创建分支,推送您的代码更改,然后将其提交以供审阅。
# R: k  a) ?1 W" ?: S
6 E( }: I, L, M9 D8 M接下来,使用“git checkout <branch>”切换到你希望构建的任何分支。(主体,快照,测试分支等)0 a. o3 W/ R7 K' ~

% Z& S& b! U5 n7 D% G' _  R通过“git submodule update --init”来启动Bukkit下游系统和CraftBukkit构建的更新。* R; l' \' b  Y* F
0 l* W2 B- {$ s. ^1 S( T9 ?
下载完成后,您就可以通过执行源文件夹根目录中的“./applyPatches.sh”文件来应用Spigot的补丁。0 e8 e* z* @2 a# P9 M1 p
9 _* E# r) a/ h# k# T- Q
完成此操作后,您现在可以在Spigot-Server和Spigot-API下找到您可以使用的完整的Spigot源代码副本。, K) V# z' Q) z+ a  i9 n

+ @! p, E( G4 K* g3 [构建Spigot
(顶部)8 T6 K+ k. b# m% n$ ]' E
一旦完成了编辑IDE或选择的文本编辑程序中的更改,请回到源代码的根目录,使用Maven清理上一次的工作区(“mvn clean install”)。
0 W6 w4 m5 M- C
! k8 a& n/ f5 ^" ~) U您现在可以在./Spigot/Spigot-Server/target/spigot-genericMinecraftVersion-GenericBukkitBuildVersion.jar中找到您的自定义Spigot版本
3 M* K9 X. z! l1 e6 B) w& `: H5 U6 P: R1 O6 U  Q$ v, t
创建一个用于提交或本地使用的补丁文件(顶部)
. J( g  e8 @7 f: s; v- `进入您进行更改的Spigot(API / Server)部分的目录。
, `1 P8 g% |$ B1 c5 {, |
" s5 k5 e: L/ l- p! Y7 ^将更改后的文件放到暂存区并在本地提交。+ }1 I! ]2 [4 z0 ]2 }! v2 e

5 i7 t7 T- N* q回到根目录并执行./rebuildPatches.sh文件。% A  v# |2 @1 B. O$ n, X0 O
2 S1 I* a$ N* N; K" [( c
您现在可以在根目录下的相关文件夹((Craft)Bukkit-patches)中找到您的.patch作为最后一个补丁文件(假设您没有时间使用或提交)。. N6 C, ]9 k/ f; S: r

# c# Q. T8 X5 |
2.理解栈堆跟踪
- I+ W+ N1 L7 W; o; r  m- e# o, U" u! V9 z! g  m+ J
" [; S4 I, p. [5 j  |9 r0 V2 r2 k$ j
堆栈跟踪本质上是由插件(或软件)给出的长的错误消息以通知用户或开发人员出错的地方。堆栈跟踪包含两个部分:发生的实际错误以及发生错误的代码的位置。这些信息可以帮助作为服务器管理员的你弄清楚出了什么问题。# Y2 e. J5 R& S) G( h3 X

% u% F( O, T3 B% V) k/ d内容+ ]+ U; s! j$ P" i' k/ L% C
插件栈堆跟踪# Y! ^, h3 A& ~8 A# w1 R
解析YAML时的栈堆跟踪
  v% b9 M  l# s
插件堆栈追踪(顶部)
  C# U( K# }1 F' \9 j0 P8 p  q" l! j0 ^

9 k' R4 P. v0 L9 T# w. l+ S以下是插件堆栈跟踪示例:
  b0 C( K/ z. J$ J
  1. [11:56:54] [Server thread / WARN]:java.lang.NullPointerException
    ; m7 z* E$ Y3 y. L3 [: Q
  2. [11:56:54] [Server thread / WARN]:at net.paradoxmc.NetworkManager.Points.PointsAPI.getPoints(PointsAPI.java: 28)
    ( K, F8 a' h1 A: s: y# @4 J( z$ Z, {
  3. [11:56:54] [Server thread / WARN]:at net.paradoxmc.NetworkManager.GizmoManager.ScoreboardManager $ 1.run(ScoreboardManager.java:40)
    / L% g, S1 L- Z- G7 Q: Y  [8 ]" L
  4. [11:56:54] [Server thread / WARN]:at org.bukkit.craftbukkit.v1_7_R4.scheduler.CraftTask.run(CraftTask.java:71)
    ! f3 ^" m1 R5 m2 V( s/ a" C9 N
  5. [11:56:54] [Server thread / WARN]:at org.bukkit.craftbukkit.v1_7_R4.scheduler.CraftScheduler.mainThreadHeartbeat( CraftScheduler.java:350)[11:56:54
    7 B  b" s6 u; G2 _
  6. ] [Server thread / WARN]:at net.minecraft.server.v1_7_R4.MinecraftServer.v(MinecraftServer.java:641)
    # L. g* Z7 q( k% k
  7. [11:56:54] [Server thread / WARN]:at net.minecraft.server.v1_7_R4.DedicatedServer.v(DedicatedServer.java:289)
    7 a8 k( v/ a5 K' L! t4 f+ c9 \
  8. [11:56:54] [Server thread / WARN]:at net。 minecraft.server.v1_7_R4.MinecraftServer.u(MinecraftServer.java:584)
    $ G8 H; @; @: r4 [) M
  9. [11:56:54] [Server thread / WARN]:at net.minecraft.server.v1_7_R4.MinecraftServer.run(MinecraftServer.java:490)
    8 z' D3 [9 C! ]. t% ?
  10. [ 11:56:54] [Server thread / WARN]:at net.minecraft.server.v1_7_R4.ThreadServerApplication.run(SourceFile:628)
复制代码
在看它的上面部分时:
5 G5 F) |3 W& @6 a
[11:56:54] [Server thread / WARN]:java.lang.NullPointerException 4 W  ]- C! l  _/ i% ^+ c$ ~
[11:56:54] [Server thread / WARN]:at net.paradoxmc.NetworkManager.Points.PointsAPI.getPoints(PointsAPI.java: 28), F2 K" c+ F% l3 c
[11:56:54] [Server thread / WARN]:at net.paradoxmc.NetworkManager.GizmoManager.ScoreboardManager $ 1.run(ScoreboardManager.java:40)
& E. v8 b( q* I
我们可以看到,对于这个错误,实际的错误发生在PointsAPI.java的第28行一个名为getPoints()的函数中。这种错误的情况是插件的点数系统无法连接到数据库。ScoreboardManager $ 1.run()ScoreboardManager类中的一个匿名(如无指定名称)类调用此函数,这将成为计分板(scoreboard)更新的原因。
8 F2 x9 }; G( a% }! A
. M3 s" X) t+ q1 l; z8 ]" d栈堆跟踪的后半部分是来自调用代码的服务器插件:
0 k2 V0 _) N# f2 ~. A+ w# e
  1. [11:56:54] [Server thread / WARN]:at org.bukkit.craftbukkit.v1_7_R4.scheduler.CraftTask.run(CraftTask.java:71)+ {1 |. T: R2 {2 p
  2. [11:56:54] [Server thread / WARN]:at org.bukkit.craftbukkit.v1_7_R4.scheduler.CraftScheduler.mainThreadHeartbeat(CraftScheduler.java:350)
    ! u. }$ w% |% S
  3. [11:56:54] [Server thread / WARN]:at net.minecraft.server.v1_7_R4.MinecraftServer.v(MinecraftServer.java :641)( M  w# J# ]9 T* C: t( b
  4. [11:56:54] [Server thread / WARN]:at net.minecraft.server.v1_7_R4.DedicatedServer.v(DedicatedServer.java:289)$ Z9 o1 }( O& v8 ^! K# H5 k
  5. [11:56:54] [Server thread / WARN]:at net.minecraft.server.v1_7_R4.MinecraftServer.u(MinecraftServer.java:584)
    6 U6 r% Y2 B. n3 p& y/ Y
  6. [11:56:54] [Server thread / WARN]:at net.minecraft.server.v1_7_R4.MinecraftServer.run(MinecraftServer.java: 490)# \0 h% E0 O! A( u% A
  7. [11:56:54] [Server thread / WARN]:at net.minecraft.server.v1_7_R4.ThreadServerApplication.run(SourceFile:628)
复制代码

% i& O, A7 Y- S1 i6 Q" ]
解析YAML时的栈堆跟踪* v, w. S# K9 C: i  \' a- Y
( l( e* M- V8 Y, @% Y" J. \5 W
2 k- P" `7 w, G  c% [; l& {& `2 e
人们经常会感到困惑,认为这是插件的问题,但它通常不是。这是一个可以轻易纠正的问题。这是来自PermissionsEx的栈堆跟踪示例,是由于更改前缀时的语法错误导致的:
. E" t. g# O1 W
  1. ru.tehkode.permissions.exceptions.PermissionBackendException: Error loading permissions file!
    : Z6 V* v7 I2 U+ F) r
  2.     at ru.tehkode.permissions.backends.file.FileBackend.reload(FileBackend.java:331) ~[PermissionsEx.jar:?]
    4 P+ V* U( {3 T$ ]
  3.     at ru.tehkode.permissions.backends.file.FileBackend.<init>(FileBackend.java:119) ~[PermissionsEx.jar:?]( |* P/ `3 K& j* r3 }- ~, y
  4.     at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[?:1.7.0_55]
    ! x) k$ H* W) g$ P+ V9 h
  5.     at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) ~[?:1.7.0_55]
    , x4 |/ P. ^" U
  6.     at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[?:1.7.0_55]
    4 Y: E* n) H& T* A' ]
  7.     at java.lang.reflect.Constructor.newInstance(Constructor.java:526) ~[?:1.7.0_55]: _. ]' p" J: }; S7 Y8 |
  8.     at ru.tehkode.permissions.backends.PermissionBackend.getBackend(PermissionBackend.java:372) ~[PermissionsEx.jar:?]
    - F+ V/ |  s' {8 Z4 S0 b; z
  9.     at ru.tehkode.permissions.backends.PermissionBackend.getBackend(PermissionBackend.java:347) ~[PermissionsEx.jar:?]. t! {# I( y, s3 p, }
  10.     at ru.tehkode.permissions.PermissionManager.createBackend(PermissionManager.java:713) ~[PermissionsEx.jar:?]2 |; ^. H1 v# P: o9 |3 F
  11.     at ru.tehkode.permissions.PermissionManager.setBackend(PermissionManager.java:695) ~[PermissionsEx.jar:?]
    ) i2 |# f2 t$ d- u, ?
  12.     at ru.tehkode.permissions.PermissionManager.initBackend(PermissionManager.java:772) ~[PermissionsEx.jar:?]
    7 S9 S  u$ K9 F* f! k0 n& p/ W  @
  13.     at ru.tehkode.permissions.PermissionManager.<init>(PermissionManager.java:74) ~[PermissionsEx.jar:?]. b5 u# F8 J/ T' [  t; J$ y, b
  14.     at ru.tehkode.permissions.bukkit.PermissionsEx.onEnable(PermissionsEx.java:158) [PermissionsEx.jar:?]6 Q  Y7 X/ F$ Q7 F5 d8 J, g$ [
  15.     at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:316) [spigot.jar:git-Spigot-1604]9 S) e) R5 g$ c' n6 d# e% i8 o
  16.     at org.bukkit.plugin.java.JavaPluginLoader.enablePlugin(JavaPluginLoader.java:329) [spigot.jar:git-Spigot-1604]
    + q* @5 ^2 t: P# Z
  17.     at org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:405) [spigot.jar:git-Spigot-1604]5 o$ u( Z8 \1 W0 H1 h+ z
  18.     at org.bukkit.craftbukkit.v1_7_R4.CraftServer.loadPlugin(CraftServer.java:476) [spigot.jar:git-Spigot-1604]7 j: W6 ^2 a& e. ?+ P9 o, L4 I
  19.     at org.bukkit.craftbukkit.v1_7_R4.CraftServer.enablePlugins(CraftServer.java:394) [spigot.jar:git-Spigot-1604]
      d* @: R  D! v' I! V
  20.     at org.bukkit.craftbukkit.v1_7_R4.CraftServer.reload(CraftServer.java:866) [spigot.jar:git-Spigot-1604]+ m/ I- T4 U: c' F# W' P& |# |6 w5 F
  21.     at org.bukkit.Bukkit.reload(Bukkit.java:301) [spigot.jar:git-Spigot-1604]
    , _0 @: ~& x/ H9 ^8 ]0 j8 M8 p' D3 r7 `* E
  22.     at org.bukkit.command.defaults.ReloadCommand.execute(ReloadCommand.java:23) [spigot.jar:git-Spigot-1604]! s- U' p9 J( S$ Q+ I
  23.     at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:181) [spigot.jar:git-Spigot-1604]
    5 K6 f$ `1 x! Y  x2 R
  24.     at org.bukkit.craftbukkit.v1_7_R4.CraftServer.dispatchCommand(CraftServer.java:767) [spigot.jar:git-Spigot-1604]
    % k1 o4 O. L* R+ K* K4 |
  25.     at org.bukkit.craftbukkit.v1_7_R4.CraftServer.dispatchServerCommand(CraftServer.java:753) [spigot.jar:git-Spigot-1604]/ y' D7 v1 l$ y, R4 f& z1 z
  26.     at net.minecraft.server.v1_7_R4.DedicatedServer.aB(DedicatedServer.java:326) [spigot.jar:git-Spigot-1604]
    ' V* {/ g2 w) g  Z
  27.     at net.minecraft.server.v1_7_R4.DedicatedServer.v(DedicatedServer.java:290) [spigot.jar:git-Spigot-1604]
    ' V7 {: l0 x4 a6 y+ a8 d' ?: {
  28.     at net.minecraft.server.v1_7_R4.MinecraftServer.u(MinecraftServer.java:584) [spigot.jar:git-Spigot-1604]2 U7 X+ X' C- k. Z: t: W2 L
  29.     at net.minecraft.server.v1_7_R4.MinecraftServer.run(MinecraftServer.java:490) [spigot.jar:git-Spigot-1604]
    - z  a- M6 K2 n
  30.     at net.minecraft.server.v1_7_R4.ThreadServerApplication.run(SourceFile:628) [spigot.jar:git-Spigot-1604]# O. J1 ~+ o, t
  31. Caused by: org.bukkit.configuration.InvalidConfigurationException: while parsing a block mapping
    2 j& `+ a7 d+ b- `" u, f
  32. in 'string', line 10, column 7:; M9 p$ [7 ^2 A+ M+ {, D2 ^/ u
  33.           suffix: '&f'
    9 g4 t# k0 y0 F
  34.           ^
    ' d; z5 e* x! `+ W' K3 V% C
  35. expected <block end>, but found Scalar$ A) D9 }, b% Y4 g. [, F7 x. d
  36. in 'string', line 12, column 17:% A3 ?; V  @( v1 Q
  37.           default: 'false'
    - S8 K+ J6 y) i0 V5 v0 h$ y
  38.                     ^- U; f& T' A3 i" J3 J

  39. / r( `' |, ?: Q. A9 M7 V( f- V
  40.     at org.bukkit.configuration.file.YamlConfiguration.loadFromString(YamlConfiguration.java:57) ~[spigot.jar:git-Spigot-1604]3 h% `0 j: p/ c  J& I- \; a( [/ m  m& P7 X
  41.     at ru.tehkode.permissions.backends.file.FileConfig.loadFromString(FileConfig.java:62) ~[PermissionsEx.jar:?]
    & B5 I2 _; Y! k
  42.     at org.bukkit.configuration.file.FileConfiguration.load(FileConfiguration.java:226) ~[spigot.jar:git-Spigot-1604]
    2 Y8 l$ q6 f3 F2 _$ I7 U% l' }
  43.     at org.bukkit.configuration.file.FileConfiguration.load(FileConfiguration.java:169) ~[spigot.jar:git-Spigot-1604]
    % z! H" S& `9 j, a1 t  ~% C
  44.     at ru.tehkode.permissions.backends.file.FileConfig.load(FileConfig.java:32) ~[PermissionsEx.jar:?]. H4 A2 q4 s; Y" d- o
  45.     at ru.tehkode.permissions.backends.file.FileBackend.reload(FileBackend.java:319) ~[PermissionsEx.jar:?]
    * q* O3 z( ~" m. ]& Z
  46.     ... 28 more  M, {! K. w, \. u# V5 R6 l
  47. Caused by: org.yaml.snakeyaml.parser.ParserException: while parsing a block mapping; expected <block end>, but found Scalar;  in 'string', line 12, column 17:# m$ S9 O8 B4 z6 T  m* e( o
  48.           default: 'false'1 ?. w2 f. h! P
  49.                     ^  z1 p. w# u7 X3 M7 U
  50.     at org.yaml.snakeyaml.parser.ParserImpl$ParseBlockMappingKey.produce(ParserImpl.java:570) ~[spigot.jar:git-Spigot-1604]
    ( [# G' l" A' X
  51.     at org.yaml.snakeyaml.parser.ParserImpl.peekEvent(ParserImpl.java:158) ~[spigot.jar:git-Spigot-1604]. ?2 }+ f3 m5 S4 j; L) I
  52.     at org.yaml.snakeyaml.parser.ParserImpl.checkEvent(ParserImpl.java:143) ~[spigot.jar:git-Spigot-1604]
    5 u7 N; y2 a# \0 U/ ^
  53.     at org.yaml.snakeyaml.composer.Composer.composeMappingNode(Composer.java:230) ~[spigot.jar:git-Spigot-1604]
    ! a; N7 l: m: e) k* Y; t
  54.     at org.yaml.snakeyaml.composer.Composer.composeNode(Composer.java:159) ~[spigot.jar:git-Spigot-1604]; T8 b0 ?' D  M9 Z6 _- q
  55.     at org.yaml.snakeyaml.composer.Composer.composeMappingNode(Composer.java:237) ~[spigot.jar:git-Spigot-1604]
    8 ?$ _: Z' e8 _1 W' N* l
  56.     at org.yaml.snakeyaml.composer.Composer.composeNode(Composer.java:159) ~[spigot.jar:git-Spigot-1604]& E4 x* r9 e% V) ~0 @3 n: @) B
  57.     at org.yaml.snakeyaml.composer.Composer.composeMappingNode(Composer.java:237) ~[spigot.jar:git-Spigot-1604]) |+ L! f# j8 _: Z) f5 u* h, M
  58.     at org.yaml.snakeyaml.composer.Composer.composeNode(Composer.java:159) ~[spigot.jar:git-Spigot-1604]
    * x! h* a' N# K# N1 b  W, @
  59.     at org.yaml.snakeyaml.composer.Composer.composeMappingNode(Composer.java:237) ~[spigot.jar:git-Spigot-1604]* k9 R8 v% N& e2 k, r
  60.     at org.yaml.snakeyaml.composer.Composer.composeNode(Composer.java:159) ~[spigot.jar:git-Spigot-1604]
    ) f' y% y+ v  U9 ?7 a& h8 h' B
  61.     at org.yaml.snakeyaml.composer.Composer.composeDocument(Composer.java:122) ~[spigot.jar:git-Spigot-1604]
    ) r3 Q5 H5 f( Q7 p% g2 r+ r9 |( S
  62.     at org.yaml.snakeyaml.composer.Composer.getSingleNode(Composer.java:105) ~[spigot.jar:git-Spigot-1604]
    + V& p# [! a- e1 R( D/ f& j8 T
  63.     at org.yaml.snakeyaml.constructor.BaseConstructor.getSingleData(BaseConstructor.java:120) ~[spigot.jar:git-Spigot-1604]- k  b1 d8 p  Q8 B, h( \6 C
  64.     at org.yaml.snakeyaml.Yaml.loadFromReader(Yaml.java:481) ~[spigot.jar:git-Spigot-1604]0 P5 X8 a5 y2 W" L" D7 Q
  65.     at org.yaml.snakeyaml.Yaml.load(Yaml.java:400) ~[spigot.jar:git-Spigot-1604]
    * Y) J0 U& g6 q8 C6 `% c7 I$ M; R( g
  66.     at org.bukkit.configuration.file.YamlConfiguration.loadFromString(YamlConfiguration.java:55) ~[spigot.jar:git-Spigot-1604]5 P+ S' F8 V* F, F4 \
  67.     at ru.tehkode.permissions.backends.file.FileConfig.loadFromString(FileConfig.java:62) ~[PermissionsEx.jar:?]3 G4 q5 |3 O) F" i: A2 Z9 E4 p
  68.     at org.bukkit.configuration.file.FileConfiguration.load(FileConfiguration.java:226) ~[spigot.jar:git-Spigot-1604]
    - h+ l2 i3 J& J7 q8 `& N2 h$ G
  69.     at org.bukkit.configuration.file.FileConfiguration.load(FileConfiguration.java:169) ~[spigot.jar:git-Spigot-1604]2 S4 D9 \% v" s6 f9 @
  70.     at ru.tehkode.permissions.backends.file.FileConfig.load(FileConfig.java:32) ~[PermissionsEx.jar:?]
    % X, b+ Q- x- S8 R, n
  71.     at ru.tehkode.permissions.backends.file.FileBackend.reload(FileBackend.java:319) ~[PermissionsEx.jar:?]5 w, h' E) B& Q2 V& t1 {9 c
  72.     ... 28 more
复制代码
栈堆跟踪会通知您是在解析配置时发生的错误。我们现在将使用一个工具(下载地址为http://yaml-online-parser.appspot.com/)来确定问题所在。
9 U" ^2 t. S# f; }5 Z/ D* U6 O
这是可疑的组:2 @) [+ j1 o; B; p
Helper:$ G# }* Y( Z1 \, d3 C
    build: false0 z7 a( S0 D) Z( q; Q
    inheritance:+ r* p) N; a' m* r  R
    - Member/ l# N: Q) J9 q# O6 R* w' M
    - Donor
/ @2 g( j7 u& T8 T, b0 O' y    permissions:
1 o2 `- |! ~0 E4 G- P    - networkmanager.nohide
7 C% ]6 e# @$ H    options:8 w0 d) u0 W4 f2 A; g% E
      suffix: '&f'2 C6 Q2 H7 r& V2 }
      prefix: '&8[&9HELPER&8]' E, ?+ [. k$ N/ m3 T. f
      default: 'false'

( k/ K8 G; e3 L! D当我们将permissions.yml文件的可疑部分粘贴到解析器工具中时,这就是我们得到的结果:
7 @6 G! c" F: j. e, s . g6 @; }2 P. ~- ?  S* |; R, x4 F' t
从这里您将能够识别错误并确定您是否已实时修复它。通常错误会出现在其他行上,如果找不到的话,在给出的这一行周围寻找即可。
0 y  k! ~( M4 ?* U7 K. [
- P; s: [# k1 X3.从Eclipse到Intellij
0 e5 l2 M- Q! }6 _9 @7 F( p0 K% I" [# j  H9 F6 h9 z  [* z! a0 o

, t& f5 n# H2 M" A3 t2 q许多人一直在要求我写一个从eclipse到IntelliJ的教程,并且在spigot站内也缺少可以使用的优秀教程。
- }4 R0 l0 b% a+ q% B9 e2 E2 \% a4 f  N! ?
在下面的wiki中,我将教你以下的内容:, R) n$ s# f. X

4 u* s* s" u8 g; I" N+ c. I- 安装IntelliJ , b+ v5 i( t/ Z; T0 p
- 从Eclipse切换到IntelliJ
1 x8 ?0 _/ v8 V4 ]. T; \0 n9 v- 设置项目* z) M. \& z" V
- 构建项目资源- M# {# M; F; ]/ E. |
- 成功将项目导出为jar文本+ z7 }7 Q" K: V: c
$ P9 J8 F# i# z5 U
1)安装IntelliJ : ^6 i9 d5 o; o% g/ V
3 O6 h! [; M$ I' w+ s# P: O0 E" j
下列指南的前提条件是:假设你已经安装了JDK!
/ l' g. S$ ]) o% \; m
3 E2 ^# Y$ |2 s/ S" U) U# C
Windows:
- i2 _5 a! \" f
" M+ ?9 ]0 P1 V1 n" s1.从他们的官方网站下载IntelliJ 。
2 q8 x- _  t9 K$ t  O3 U. f2.运行下载的.exe文件,然后按照安装向导操作即可。
3 P/ [. \% I) c. j5 c' G
$ _) a8 _/ G% B苹果电脑:
& I+ n% ^5 @. A( o4 e3 I! E& i; J" W7 L! c, _( l
1.从他们的官方网站下载IntelliJ。1 g9 ]8 ]9 \; h$ B( m
2.打开.DMG文件
7 @% V7 V! I, \$ a# {3.将该文件拖到应用程序目录。
1 n9 a/ e$ J1 Y* j; A( i1 s! Y1 K3 C& f
Linux:2 `  d* Z3 U# V9 O1 @& J9 d
本教程略为高级,假设你有Ubuntu / CentOS。; n% {7 }& d; W0 H
注意:我只是一个centos和Ubuntu系统管理员,如果您运行的是不同的操作系统,请参阅Google
  r7 h% k, m' x% N/ T7 I/ }2 k1 E
[Ubuntu] & g* ]5 ^# w: G/ }! d

' }# m- c+ N( q$ E0 R' D( o) b1)请参阅IntelliJ网站并下载tar.gz文件
0 y7 G- c8 A/ I1 q5 U6 T' z; I" A5 a: R0 k7 G; L3 R, u( }" ~
2)重命名文件夹“idea.tar.gz”并将其移动到桌面1 }6 M7 D8 ~9 v) s. h

5 L( L2 Q) ^, _6 F4 U7 R3)现在,您要在终端窗口中执行以下命令以解压tar.gz文件:2 U1 F* P& D; x" p% F3 }# X
  1. tar xzvf idea.tar.gz
复制代码
完成后,桌面上会新建一个文件夹,在控制台窗口中输入:: l; [8 Q- P/ m) N4 D
  1. cd Desktop: m8 D$ z+ V4 ]- l  U. K  a, _4 ^' \
  2. cd idea
复制代码
这会把你带到你的IDEA文件,现在切换到bin目录并启动sh文件,输入:4 y8 E6 E/ Q5 [$ b' h
  1. cd bin
    , W+ m, u8 T3 f  O9 d
  2. /idea.sh
复制代码
完结撒花~
  i: l+ R$ L' F" _' h2 F) z0 C" V
9 c, R" N8 n2 w' T* \; X2)从Intellij到Eclipse
. P* F9 X" A* M/ ^我将逐节更新这个wiki,意思是明天一节,后天再一节,等等。(作者的意思是未来更新,但最后更新时间是2015.6.19 16:52,估计已跳票3 j7 }, d, i! z9 T  q4 |

, o6 H4 P6 K9 F! @* w1 B

+ q. F' ?) N! s1 T3 I& e! K& H4.使用Minecraft区块修复器7 a  j& U" ?) l7 j( o. U! N" s
修复世界中区块、生物以及各种疑难杂症' W6 W$ @4 Z  i; E, l

7 R5 {( _. q4 j, [6 E; c, n, L7 h6 ?

+ T; B& g1 U# i; L! {) E背景
- }+ y2 p% Z. ^) R有时,Minecraft服务器可能会有导致区块损坏或用户使用太多实体过载区块的问题。Fenixin的Minecraft Region Fixer是帮助你解决这些问题的最佳工具。+ d8 |( P, p) u9 m* K% e

& W. W! P# ~6 }& \6 ]3 L- ]' p1 u

% z' ~- t, V2 K' P! @获取工具
6 x" l; f' H2 I. m通过使用git的这些命令中的任何一个来在GitHub上复制Fenixin的库
* U0 c( S7 {' ]或者,如果您没有或不想使用git,则可以在此链接下载归档文件- n) |5 l3 c% T; a( Z* W
5 F$ f. x4 p9 J7 s0 v* f. U) x
如果你不打算使用Python,你可以跳过这一步,并使用下面的可执行文件。

* z2 t1 l7 D% q1 T" }5 N: Q, x7 n3 ~& w- x) o( v1 `; a

8 P) U* f4 G  ?. Z3 y运行该工具* Y) Z) W0 [0 m/ W- }
有两种方式来运行它,首选的方式包含原始python脚本,但也有可执行的windows文件这一选项。
8 m, L( L  I# `% Y6 z4 R5 i. R6 `3 I
. J. h7 I5 k! B. y5 ^4 _# R使用python(目前不支持Python 2.7.x,3.x的使用),您只需要转到复制或提取的工具的位置并输入下列指令:
! a6 |( C; x( y: F- i% y* Y2 N
  • python region-fixer.py <您的参数(见下文)>/ V& \) R' B3 T$ n! F. v4 Y6 m. m
但是,如果您在Windows上并且不想设置python,则可以使用Fenixin提供的可执行文件他的adfly链接位于此处,然后使用
( @; P/ h! l( ~0 A- _2 y4 F
  • region-fixer.exe <您的参数(见下文)>
    ) I" A3 n5 m& S8 n7 J2 S  G, |

5 t, g. ^$ W' Q& w, ]: n; |
2021.12 数据,可能有更多内容1.复制,构建和编译Spigot源代码
% X# M7 v' l) ?! h! @8 o. f
' A8 h: L6 b$ A9 J3 Q. N* G, F6 |/ M3 _( f6 y, @
获得Spigot的源码以成功进行开发工作" F" G+ l" ]: F$ f& \8 S: |

6 o+ H" S: D2 S* X7 f5 I9 s% |
?: ?+ H7 ?; ab# P$ l内容
, e: W4 s; H8 `% F8 r- c- B前提条件
, `/ }# A. F8 P获取源代码; K* s( k" ?) ^+ j2 J3 b& }
构建spigot
Q" e. j) f! F) S创建一个用于提交或本地使用的补丁文件
: d! ds- z% A0 ?* a. V3 a) I1 b! l0 L2 Q/ Y

% ]; S$ @" e: [/ L# ]! e9 l前提条件(顶部)
; W" w. {& d. r. ~* j1 `8 W2 _: C拥有基础Git知识
) K; }$ @- v) L4 K一个基于Unix的系统或一个bash解释器(比如Cygwin,Git Bash等)
, t. h; g9 s( c% Z/ XMaven 3.0.5与路径设置
- \( nv% ~6 z* ?: F- Q8 y' [: ]: I' Q1 v; _7 T

4 g3 H/ Z& p; ]$ h* R, I% c获取源代码(顶部)" x0 ]& ^. u) I& V) a( F
首先,从复制Spigot源码开始。如果你想创建一个分支,你需要在JIRA上创建一个账户。填写SpigotMC CLA并等待24小时以激活您的Stash账户。请确保您的用户名和电子邮件地址相符。一旦您的账户被激活,请使用您的JIRA凭证登录到Stash。然后,您可以创建分支,推送您的代码更改,然后将其提交以供审阅。
& q0 N1 `! `1 o8 Y; L* D" v2 Y( C; b! [
* b% W8 i1 B% Z# ^) q
接下来,使用“git checkout &lt;branch&gt;”切换到你希望构建的任何分支。(主体,快照,测试分支等)- L. \3 {1 a0 D[

f$ |2 Y* E* o# {, j8 ]% k3 y% u; K% ~# e" [4 a0 w
通过“git submodule update --init”来启动Bukkit下游系统和CraftBukkit构建的更新。; n6 u. ^+ E& o

8 P* m$ n0 n7 M; i- d
4 z9 Q2 C/ ~( M4 j1 d下载完成后,您就可以通过执行源文件夹根目录中的“./applyPatches.sh”文件来应用Spigot的补丁。
- d' y9 a, L, g5 P/ @' t( t) k% e1 E" L. s
: Cb: n. ?- O* ~/ Z: B
完成此操作后,您现在可以在Spigot-Server和Spigot-API下找到您可以使用的完整的Spigot源代码副本。, ?/ T+ v! l, l2 T

- |" n8 as$ j' C0 b2 u; L3 _5 r" }
构建Spigot(顶部)
+ l9 o9 R, m5 o- B% }一旦完成了编辑IDE或选择的文本编辑程序中的更改,请回到源代码的根目录,使用Maven清理上一次的工作区(“mvn clean install”)。
3 e: I9 p# m4 ?5 ^( P9 |1 F
8 y& Z6 d8 I) E5 J. e: ]2 W
2 S0 l, l+ C- J7 O1 V& O您现在可以在./Spigot/Spigot-Server/target/spigot-genericMinecraftVersion-GenericBukkitBuildVersion.jar中找到您的自定义Spigot版本
1 h! K/ n3 x& x" |5 E: O
8 n* s: E/ e, s5 r
: l& e8 XQ5 F2 Z* W创建一个用于提交或本地使用的补丁文件(顶部)9 p6 V. C- @+ T' l& ~
进入您进行更改的Spigot(API / Server)部分的目录。1 M6 m% w& W! `! W3 Y% [( _- C+ ~
/ L6 @/ q. m& w* {

' H$ i0 |# CO3 q将更改后的文件放到暂存区并在本地提交。
. B8 ^- u" Z( b* h6 e4 k/ f
5 I?* S7 t! m! S% C/ k% I3 k0 \" p! s5 ^7 y; _6 o$ G3 ~
回到根目录并执行./rebuildPatches.sh文件。
L# I7 j" Z4 @- f" C# j/ C5 J" X! F# A# x/ U
) U* ?7 Y1 V/ u7 _
您现在可以在根目录下的相关文件夹((Craft)Bukkit-patches)中找到您的.patch作为最后一个补丁文件(假设您没有时间使用或提交)。
) Y" i) S( C, o1 \& k$ b2 T) c* a! j9 m7 B) F. p6 r3 p: a
2 o5 q! F. a8 R2 m9 b3 _
2.理解栈堆跟踪8 r' J! B# R! j( N1 f9 E

/ Q3 _- A. _4 d0 |

! E" x) X" y, a* w堆栈跟踪本质上是由插件(或软件)给出的长的错误消息以通知用户或开发人员出错的地方。堆栈跟踪包含两个部分:发生的实际错误以及发生错误的代码的位置。这些信息可以帮助作为服务器管理员的你弄清楚出了什么问题。1 r- K, h1 c. G. i7 R; `

# W4 G5 |: D; @( \: R0 ]+ VN! x3 q5 ~
内容) k( P1 C( C% H$ n
插件栈堆跟踪" o: r" x; ]( {2 Y, q& g
解析YAML时的栈堆跟踪
# L* k1 N5 v, [7 X: f) B8 v插件堆栈追踪(顶部)$ S$ K+ {( I8 g
) |/ S9 x3 j2 W4 T" n+ Y
( d+ W. |' r0 X+ G! }+ c/ I/ `- b# G9 [
以下是插件堆栈跟踪示例:9 \+ Y6 T$ u" |o9 c

代码:

  1. [11:56:54] [Server thread / WARN]:java.lang.NullPointerException
    6 x1 @. M* h3 g# e
  2. [11:56:54] [Server thread / WARN]:at net.paradoxmc.NetworkManager.Points.PointsAPI.getPoints(PointsAPI.java: 28)- C$ g( vP( h& l3 |; ~* n
  3. [11:56:54] [Server thread / WARN]:at net.paradoxmc.NetworkManager.GizmoManager.ScoreboardManager $ 1.run(ScoreboardManager.java:40)
    8 Z5 }1 k$ M_( @( k
  4. [11:56:54] [Server thread / WARN]:at org.bukkit.craftbukkit.v1_7_R4.scheduler.CraftTask.run(CraftTask.java:71)9 M& C* G0 U$ q/ K2 K4 N8 c0 N
  5. [11:56:54] [Server thread / WARN]:at org.bukkit.craftbukkit.v1_7_R4.scheduler.CraftScheduler.mainThreadHeartbeat( CraftScheduler.java:350)[11:56:54
    $ vD3 E" l' j, j, M! n
  6. ] [Server thread / WARN]:at net.minecraft.server.v1_7_R4.MinecraftServer.v(MinecraftServer.java:641)
    - E" J% z* Y" S' j5 i9 W: y
  7. [11:56:54] [Server thread / WARN]:at net.minecraft.server.v1_7_R4.DedicatedServer.v(DedicatedServer.java:289)
    ; T( i4 ]5 X6 F( l: k
  8. [11:56:54] [Server thread / WARN]:at net。 minecraft.server.v1_7_R4.MinecraftServer.u(MinecraftServer.java:584)2 X+ i) m) W2 c
  9. [11:56:54] [Server thread / WARN]:at net.minecraft.server.v1_7_R4.MinecraftServer.run(MinecraftServer.java:490)
    . Z1 M( P1 X5 q! S7 N' m' P
  10. [ 11:56:54] [Server thread / WARN]:at net.minecraft.server.v1_7_R4.ThreadServerApplication.run(SourceFile:628)
在看它的上面部分时:& x" t( W# w; z8 m8 B4 ]
[11:56:54] [Server thread / WARN]:java.lang.NullPointerException u/ F- s- T5 O" w
[11:56:54] [Server thread / WARN]:at net.paradoxmc.NetworkManager.Points.PointsAPI.getPoints(PointsAPI.java: 28)6 }' t/ p+ [8 o. G
[11:56:54] [Server thread / WARN]:at net.paradoxmc.NetworkManager.GizmoManager.ScoreboardManager $ 1.run(ScoreboardManager.java:40)

! z! i' Z7 r& j, q+ _. \我们可以看到,对于这个错误,实际的错误发生在PointsAPI.java的第28行一个名为getPoints()的函数中。这种错误的情况是插件的点数系统无法连接到数据库。ScoreboardManager $ 1.run()ScoreboardManager类中的一个匿名(如无指定名称)类)调用此函数,这将成为计分板(scoreboard)更新的原因。% s1 U7 _- \/ s

$ [* G/ Z+ k+ i: \- z- S; P
6 j- \; u+ U2 Z" `9 X, y栈堆跟踪的后半部分是来自调用代码的服务器插件:1 x( \" C, x2 U' k; {7 {

代码:

  1. [11:56:54] [Server thread / WARN]:at org.bukkit.craftbukkit.v1_7_R4.scheduler.CraftTask.run(CraftTask.java:71)
    # b' p, K) x! N. N2 H6 B( A. r! j
  2. [11:56:54] [Server thread / WARN]:at org.bukkit.craftbukkit.v1_7_R4.scheduler.CraftScheduler.mainThreadHeartbeat(CraftScheduler.java:350)
    ! w, F; O$ E' K5 C3 e4 Z9 J* N! W
  3. [11:56:54] [Server thread / WARN]:at net.minecraft.server.v1_7_R4.MinecraftServer.v(MinecraftServer.java :641); `" ]" b$ A+ w$ R
  4. [11:56:54] [Server thread / WARN]:at net.minecraft.server.v1_7_R4.DedicatedServer.v(DedicatedServer.java:289)' C. \9 L. s- O9 c3 G/ y( O
  5. [11:56:54] [Server thread / WARN]:at net.minecraft.server.v1_7_R4.MinecraftServer.u(MinecraftServer.java:584)
    7 g" Z& @4 A: @% o/ c2 k3 e
  6. [11:56:54] [Server thread / WARN]:at net.minecraft.server.v1_7_R4.MinecraftServer.run(MinecraftServer.java: 490)* N; s# F" b9 \
  7. [11:56:54] [Server thread / WARN]:at net.minecraft.server.v1_7_R4.ThreadServerApplication.run(SourceFile:628)
% l/ p4 e0 W, q5 j]( e, z
解析YAML时的栈堆跟踪8 {8 H0 |/ ?4 e4 B/ z
0 U+ o7 o$ R/ r* X& I
/ B. q. k. b2 I- U) Q, v. v
人们经常会感到困惑,认为这是插件的问题,但它通常不是。这是一个可以轻易纠正的问题。这是来自PermissionsEx的栈堆跟踪示例,是由于更改前缀时的语法错误导致的:7 z+ l$ h2 x0 B% C) r( f( T) C: z

代码:

  1. ru.tehkode.permissions.exceptions.PermissionBackendException: Error loading permissions file!
    / v% UF/ L% Z: n2 P/ B. I
  2.     at ru.tehkode.permissions.backends.file.FileBackend.reload(FileBackend.java:331) ~[PermissionsEx.jar:?]0 A3 y$ a1 |* e; ?5 [$ u! r" T
  3.     at ru.tehkode.permissions.backends.file.FileBackend.<init>(FileBackend.java:119) ~[PermissionsEx.jar:?]8 a7 W4 k0 T' G2 Vd
  4.     at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[?:1.7.0_55]" Q0 Q- |# ^* m7 X9 [$ g$ D
  5.     at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) ~[?:1.7.0_55]
    4 w, I4 }. |& e+ l
  6.     at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[?:1.7.0_55]J5 T. k( h2 @# j3 \+ S
  7.     at java.lang.reflect.Constructor.newInstance(Constructor.java:526) ~[?:1.7.0_55]5 u* w$ i: o6 h. E
  8.     at ru.tehkode.permissions.backends.PermissionBackend.getBackend(PermissionBackend.java:372) ~[PermissionsEx.jar:?]$ B; y: J9 P. _; X0 ^3 b
  9.     at ru.tehkode.permissions.backends.PermissionBackend.getBackend(PermissionBackend.java:347) ~[PermissionsEx.jar:?]$ e. [h: B- pf0 XH$ R) Q
  10.     at ru.tehkode.permissions.PermissionManager.createBackend(PermissionManager.java:713) ~[PermissionsEx.jar:?]
    ! T# m, `; F0 w- e
  11.     at ru.tehkode.permissions.PermissionManager.setBackend(PermissionManager.java:695) ~[PermissionsEx.jar:?]- f1 O8 f7 w& E: E1 ^! A
  12.     at ru.tehkode.permissions.PermissionManager.initBackend(PermissionManager.java:772) ~[PermissionsEx.jar:?]
    $ @8 C! m( D( M; o2 Z
  13.     at ru.tehkode.permissions.PermissionManager.<init>(PermissionManager.java:74) ~[PermissionsEx.jar:?]% O+ a0 u0 Y/ XU- E
  14.     at ru.tehkode.permissions.bukkit.PermissionsEx.onEnable(PermissionsEx.java:158) [PermissionsEx.jar:?]
    : a8 e6 P+ e( s& k: H9 Z2 x8 G
  15.     at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:316) [spigot.jar:git-Spigot-1604]; A% f) lk! n+ @8 T" c
  16.     at org.bukkit.plugin.java.JavaPluginLoader.enablePlugin(JavaPluginLoader.java:329) [spigot.jar:git-Spigot-1604]* ^L9 |" ^* o* Y) J
  17.     at org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:405) [spigot.jar:git-Spigot-1604]
    ( Z* d; s8 bF0 [* _4 r+ ]2 A. D) o
  18.     at org.bukkit.craftbukkit.v1_7_R4.CraftServer.loadPlugin(CraftServer.java:476) [spigot.jar:git-Spigot-1604]pU; Y# n; L/ ^; c5 B' U4 ^4 I
  19.     at org.bukkit.craftbukkit.v1_7_R4.CraftServer.enablePlugins(CraftServer.java:394) [spigot.jar:git-Spigot-1604]
    8 Q8 x; A& ~* T$ F
  20.     at org.bukkit.craftbukkit.v1_7_R4.CraftServer.reload(CraftServer.java:866) [spigot.jar:git-Spigot-1604]
    ) Y8 Q6 Z4 e, W9 k6 {# z! N3 g3 z* U
  21.     at org.bukkit.Bukkit.reload(Bukkit.java:301) [spigot.jar:git-Spigot-1604]
    9 R: g; t% a- t: }* [6 N
  22.     at org.bukkit.command.defaults.ReloadCommand.execute(ReloadCommand.java:23) [spigot.jar:git-Spigot-1604]
    6 i7 K. L5 M9 ]) d1 d& \$ Z
  23.     at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:181) [spigot.jar:git-Spigot-1604]3 m0 _3 E5 s8 f: c
  24.     at org.bukkit.craftbukkit.v1_7_R4.CraftServer.dispatchCommand(CraftServer.java:767) [spigot.jar:git-Spigot-1604]4 J. D: ~3 b# q& W. I) k
  25.     at org.bukkit.craftbukkit.v1_7_R4.CraftServer.dispatchServerCommand(CraftServer.java:753) [spigot.jar:git-Spigot-1604]' j2 N, }/ `( q7 m) D
  26.     at net.minecraft.server.v1_7_R4.DedicatedServer.aB(DedicatedServer.java:326) [spigot.jar:git-Spigot-1604]
    , P- H/ q% [; Y. k8 x' G
  27.     at net.minecraft.server.v1_7_R4.DedicatedServer.v(DedicatedServer.java:290) [spigot.jar:git-Spigot-1604]6 d: ^& @# W, A2 _" F
  28.     at net.minecraft.server.v1_7_R4.MinecraftServer.u(MinecraftServer.java:584) [spigot.jar:git-Spigot-1604]8 V5 [! A9 [% P5 F- V, Y5 q
  29.     at net.minecraft.server.v1_7_R4.MinecraftServer.run(MinecraftServer.java:490) [spigot.jar:git-Spigot-1604]
    2 b4 J: y' W8 G8 _( e) ?% `
  30.     at net.minecraft.server.v1_7_R4.ThreadServerApplication.run(SourceFile:628) [spigot.jar:git-Spigot-1604]/ Y+ U0 I. V) r9 e6 K0 w5 t
  31. Caused by: org.bukkit.configuration.InvalidConfigurationException: while parsing a block mapping
    ' h: V6 [4 p% @8 S
  32. in 'string', line 10, column 7:
    1 D8 B# F* z3 ^2 |
  33.     suffix: '&f'" q7 i" B: g, P# \5 n" v
  34.     ^( fG1 j' P% \$ L
  35. expected <block end>, but found Scalar
    ' p1 r9 G- E3 D( s% G4 Y+ r
  36. in 'string', line 12, column 17:
    7 m! K+ a6 `E! B9 n6 z3 F
  37.     default: 'false'
    . C$ M+ Y* L( LH) R* N# l
  38.   ^
    ^8 U& S& V% u, e( t
  39. 4 e* X9 M7 l; h
  40.     at org.bukkit.configuration.file.YamlConfiguration.loadFromString(YamlConfiguration.java:57) ~[spigot.jar:git-Spigot-1604]
    7 K8 L7 t! P- \% E4 \
  41.     at ru.tehkode.permissions.backends.file.FileConfig.loadFromString(FileConfig.java:62) ~[PermissionsEx.jar:?]% s/ _6 ~7 C; L1 F" X4 g* s4 j4 o
  42.     at org.bukkit.configuration.file.FileConfiguration.load(FileConfiguration.java:226) ~[spigot.jar:git-Spigot-1604]
    5 h8 @/ S/ f% t6 I/ K% \
  43.     at org.bukkit.configuration.file.FileConfiguration.load(FileConfiguration.java:169) ~[spigot.jar:git-Spigot-1604]
    5 c; a7 ~8 S( V
  44.     at ru.tehkode.permissions.backends.file.FileConfig.load(FileConfig.java:32) ~[PermissionsEx.jar:?]
    ) E9 |6 S; z3 N, j
  45.     at ru.tehkode.permissions.backends.file.FileBackend.reload(FileBackend.java:319) ~[PermissionsEx.jar:?]
    8 n1 w0 s0 d( B4 Y$ f
  46.     ... 28 more
    h% P$ t& I8 w6 Q: p2 g
  47. Caused by: org.yaml.snakeyaml.parser.ParserException: while parsing a block mapping; expected <block end>, but found Scalar;in 'string', line 12, column 17:
    k# q3 K! c7 r& \2 T% a
  48.     default: 'false'C! B' B$ }: V9 N0 e
  49.   ^1 e$ n) e" o2 G3 f3 x, g, }
  50.     at org.yaml.snakeyaml.parser.ParserImpl$ParseBlockMappingKey.produce(ParserImpl.java:570) ~[spigot.jar:git-Spigot-1604]
    - M1 H8 m7 r% P0 m6 u1 {
  51.     at org.yaml.snakeyaml.parser.ParserImpl.peekEvent(ParserImpl.java:158) ~[spigot.jar:git-Spigot-1604]5 ^* P( e' s- RQ& i4 R
  52.     at org.yaml.snakeyaml.parser.ParserImpl.checkEvent(ParserImpl.java:143) ~[spigot.jar:git-Spigot-1604]) G5 W9 \" h! C
  53.     at org.yaml.snakeyaml.composer.Composer.composeMappingNode(Composer.java:230) ~[spigot.jar:git-Spigot-1604]
    : I4 U) d+ T! s; z4 S
  54.     at org.yaml.snakeyaml.composer.Composer.composeNode(Composer.java:159) ~[spigot.jar:git-Spigot-1604]
    ( \3 Z0 F( q; e, ~
  55.     at org.yaml.snakeyaml.composer.Composer.composeMappingNode(Composer.java:237) ~[spigot.jar:git-Spigot-1604]
    2 f* O~' n: J' o. C( k7 R
  56.     at org.yaml.snakeyaml.composer.Composer.composeNode(Composer.java:159) ~[spigot.jar:git-Spigot-1604]& x' P- N; }5 h% V' K' V& Y
  57.     at org.yaml.snakeyaml.composer.Composer.composeMappingNode(Composer.java:237) ~[spigot.jar:git-Spigot-1604]
    4 N: Q, T# Z8 {* |! }& t
  58.     at org.yaml.snakeyaml.composer.Composer.composeNode(Composer.java:159) ~[spigot.jar:git-Spigot-1604]
    * [* Z+ f6 ?2 G
  59.     at org.yaml.snakeyaml.composer.Composer.composeMappingNode(Composer.java:237) ~[spigot.jar:git-Spigot-1604]
    3 p; a# d' i) Y' L
  60.     at org.yaml.snakeyaml.composer.Composer.composeNode(Composer.java:159) ~[spigot.jar:git-Spigot-1604]7 V" B4 [1 u5 B3 l
  61.     at org.yaml.snakeyaml.composer.Composer.composeDocument(Composer.java:122) ~[spigot.jar:git-Spigot-1604]
    % ]9 B* _4 r6 \! _% z1 a
  62.     at org.yaml.snakeyaml.composer.Composer.getSingleNode(Composer.java:105) ~[spigot.jar:git-Spigot-1604]
    , W) Z2 E% j$ \) R' T( y
  63.     at org.yaml.snakeyaml.constructor.BaseConstructor.getSingleData(BaseConstructor.java:120) ~[spigot.jar:git-Spigot-1604]
    ' p. xO( f: S. i. k" K
  64.     at org.yaml.snakeyaml.Yaml.loadFromReader(Yaml.java:481) ~[spigot.jar:git-Spigot-1604]
    % ^$ S3 w' R/ N$ F& A
  65.     at org.yaml.snakeyaml.Yaml.load(Yaml.java:400) ~[spigot.jar:git-Spigot-1604]
    1 ^- I/ y+ v3 h: `1 F* }0 @4 U
  66.     at org.bukkit.configuration.file.YamlConfiguration.loadFromString(YamlConfiguration.java:55) ~[spigot.jar:git-Spigot-1604]1 C- s; QQ0 T2 ?; @% n0 ?; u0 u
  67.     at ru.tehkode.permissions.backends.file.FileConfig.loadFromString(FileConfig.java:62) ~[PermissionsEx.jar:?]
    . H8 A" b; `, z) y
  68.     at org.bukkit.configuration.file.FileConfiguration.load(FileConfiguration.java:226) ~[spigot.jar:git-Spigot-1604]
    2 J; ^K) ^2 k8 }8 H: B
  69.     at org.bukkit.configuration.file.FileConfiguration.load(FileConfiguration.java:169) ~[spigot.jar:git-Spigot-1604]1 i" ^/ y! D- `$ S" [
  70.     at ru.tehkode.permissions.backends.file.FileConfig.load(FileConfig.java:32) ~[PermissionsEx.jar:?]
    1 O8 }! U; s2 c/ o. T+ mW
  71.     at ru.tehkode.permissions.backends.file.FileBackend.reload(FileBackend.java:319) ~[PermissionsEx.jar:?]
    8 }, Y! d% h( p1 O; Q[
  72.     ... 28 more
栈堆跟踪会通知您是在解析配置时发生的错误。我们现在将使用一个工具(下载地址为http://yaml-online-parser.appspot.com/)来确定问题所在。; E" W( m1 z: O1 v* i
这是可疑的组:" n+ q' ?& F+ k: c
Helper:
( f" s( ^* \% {9 x5 I$ N& L% E, |    build: false
# V/ a7 _2 T5 U5 z9 c( l    inheritance:% [9 ]+ {6 T) q+ I
    - Member
- ?+ U: T) h+ d# O    - Donor! ^9 C) D) N3 V
    permissions:
7 n2 g2 n! f% H: Y' g3 D    - networkmanager.nohide
. L$ J" Z+ [7 ?' G/ ]8 ~: N    options:( P/ J0 p4 c. T
   suffix: '&amp;f'
7 y- B" V5 A1 o) y* l. C   prefix: '&amp;8[&amp;9HELPER&amp;8]8 Y$ B6 i& t\) c4 c
   default: 'false'
7 B) }' V3 `) n3 M
当我们将permissions.yml文件的可疑部分粘贴到解析器工具中时,这就是我们得到的结果:/ N! ]$ U6 ]* m5 R9 ^
0 I( J3 n( ~Z# o$ C# W
从这里您将能够识别错误并确定您是否已实时修复它。通常错误会出现在其他行上,如果找不到的话,在给出的这一行周围寻找即可。& [# ?) I. _: g" f$ ?8 z( d

* p% u6 f0 w- |0 D' n4 ?, v$ Y* X/ |* ~3 ?
3.从Eclipse到Intellij
8 ck. n1 w# H' kB. K
: B, n, w/ H# }9 Q, h9 E3 d. E0 Tm5 U" r) `+ F
许多人一直在要求我写一个从eclipse到IntelliJ的教程,并且在spigot站内也缺少可以使用的优秀教程。: _2 s0 n2 i( ~! p! d: t, l# H
% G6 K$ A" V2 c$ M) [% Z9 c9 y$ T

$ Z; j# ]( X3 U5 u在下面的wiki中,我将教你以下的内容:
$ ^1 A/ G$ w8 w1 r) Z1 T7 i. w- O1 }6 m, z8 L; n2 n6 B' c: Q% p- N4 E

. ~9 to* }* M- 安装IntelliJ
$ }8 y; K; |5 u0 j2 }6 ^; e2 W- 从Eclipse切换到IntelliJ
6 @2 |4 A8 M% j, [2 c4 Kh- 设置项目
/ V5 j* C( Y5 _- 构建项目资源
; U3 \; A5 x' c: _; g0 d# e- 成功将项目导出为jar文本
: v' l4 E8 z* |- ~5 a7 q( f. L' T& v8 _& ]9 [" yvy6 n) w

( }% t! ?" MT: v1)安装IntelliJ
. `% o1 W& v. A7 f# D/ G8 t# l
2 v; ]9 N6 F! h) e2 G( `8 @. @: Xf3 ~% ^
下列指南的前提条件是:假设你已经安装了JDK!
/ t2 E+ v+ W5 B/ s$ [4 @7 T: \& ?

% f/ f8 b, Dj* R% ft/ NWindows:% r% oA2 Q3 ]( F3 ?z4 o; v
( J8 y0 X. a. m) R

! o3 S5 K, i$ X/ n1.从他们的官方网站下载IntelliJ 。
0 @: m+ u- b' d& e; Q3 M; b7 @2.运行下载的.exe文件,然后按照安装向导操作即可。* ^& F9 ?( \, m# Z4 W
( I, s" a, p- v
5 {$ P% ?7 I3 z$ W; k
苹果电脑:# u! G, z+ B* P# t& D0 Z
9 X, N* q* h- M

0 S' G( L' R8 I7 q6 S! L4 X4 N1.从他们的官方网站下载IntelliJ。5 |9 h/ H9 |5 T3 ~# }" I
2.打开.DMG文件 $ T4 X6 C1 |) c8 m1 X* P+ J4 q
3.将该文件拖到应用程序目录。
5 l0 W9 Q9 {5 e2 V* u9 }( g' a
7 |& y9 ?: P! A4 j3 O
. n+ i+ P+ R. vALinux:
5 r' V/ _) ^. d0 F$ E2 t本教程略为高级,假设你有Ubuntu / CentOS。2 s* O( G9 l8 j9 X* u
注意:我只是一个centos和Ubuntu系统管理员,如果您运行的是不同的操作系统,请参阅Google4 k; Y1 R0 b% PB

' d" L5 d: Ev, `* a( z( [' w' C
, g9 Lj; @5 _9 E% O2 U[Ubuntu] . S' S, Y. z0 D& S' V+ B- E

) m1 ^& N; NU
) Z/ m3 [1 z! c, y: K( B5 ~1)请参阅IntelliJ网站并下载tar.gz文件4 z, G0 h8 M+ L: X( a$ ZD

. G+ c. B+ N5 S0 h. W( r2 v
) V2 K6 Y3 E0 F9 G% W: H+ Y2)重命名文件夹“idea.tar.gz”并将其移动到桌面
' P4 P1 I# P! g1 B& z( p$ E- M9 h/ d& V1 f* {8 P: V& D. b

9 x# d0 [9 v( B( W# h: \" _3)现在,您要在终端窗口中执行以下命令以解压tar.gz文件:
4 K( z: f9 `. \; g

代码:

  1. tar xzvf idea.tar.gz
完成后,桌面上会新建一个文件夹,在控制台窗口中输入:
* y9 b9 |0 m! U0 Y: w

代码:

  1. cd Desktop
    1 A* Nj; {) J# h: q
  2. cd idea
这会把你带到你的IDEA文件,现在切换到bin目录并启动sh文件,输入:: n- W, ^% o^1 `7 p

代码:

  1. cd bin! u! ^; V4 ]' M' o
  2. /idea.sh
完结撒花~
4 z& u* m) o4 @) w5 T0 T* o
. C9 O- u9 p$ U8 z3 O( }( V0 l5 a, h) k. u4 F
2)从Intellij到Eclipse
* u; a& F9 U) x+ o9 u+ T我将逐节更新这个wiki,意思是明天一节,后天再一节,等等。(作者的意思是未来更新,但最后更新时间是2015.6.19 16:52,估计已跳票8 ~+ A- c( D1 z( i7 u' ?

) r9 t, n- i8 X8 t/ \
6 j+ N% Z* T4 }: @" F9 \0 ]
4.使用Minecraft区块修复器b7 x- U, f' ?' P
修复世界中区块、生物以及各种疑难杂症7 i7 q& m3 H" ]3 \) ^3 b
* h7 S9 I8 ak: s* R
) g' H5 ?+ r) |. wa
背景
4 s% d& M: A; L有时,Minecraft服务器可能会有导致区块损坏或用户使用太多实体过载区块的问题。Fenixin的Minecraft Region Fixer是帮助你解决这些问题的最佳工具。1 o; I4 UL: ]+ F

) R& t( |0 S' b3 ~- w

: n( m2 }% f: O2 l7 P; l获取工具0 I, s1 z1 O3 L8 f0 M- `! X
通过使用git的这些命令中的任何一个来在GitHub上复制Fenixin的库0 ]' T9 K: P7 G- j: u4 j
或者,如果您没有或不想使用git,则可以在此链接下载归档文件. ]1 d. O+ Z! J5 y5 i+ I: s
0 w. s0 b/ z/ i) m

) e5 _! p, q- qj8 G% L8 B9 j: F如果你不打算使用Python,你可以跳过这一步,并使用下面的可执行文件。
7 t2 G% F# t4 j7 c/ u
" j7 |# D/ f! G- G$ X' V6 J* d

7 x2 Gl& ~! C+ R% ?$ K& E运行该工具
8 X' ^( k1 S5 `有两种方式来运行它,首选的方式包含原始python脚本,但也有可执行的windows文件这一选项。
# D, Nm+ t* ~& R5 ]9 ]
' {3 l# O$ ~8 r2 o
7 c, l' JnD使用python(目前不支持Python 2.7.x,3.x的使用),您只需要转到复制或提取的工具的位置并输入下列指令:
& A! H3 c2 C+ p; J- t
  • python region-fixer.py &lt;您的参数(见下文)&gt;
    ; `3 ^5 M+ H2 r, N0 e4 m1 c" q
但是,如果您在Windows上并且不想设置python,则可以使用Fenixin提供的可执行文件他的adfly链接位于此处,然后使用5 q" w7 V8 K0 ]1 |6 I
  • region-fixer.exe &lt;您的参数(见下文)&gt;) D2 F" q5 e# G, o

: P) _8 s" s- T, _% ?