IDEA的下gradle项目运行test下的main()方法报错:
Exception in thread “main” java.lang.NoClassDefFoundError: com/xxxx/xxxx/xxxx/xxxx
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
at java.net.URLClassLoader
1.
r
u
n
(
U
R
L
C
l
a
s
s
L
o
a
d
e
r
.
j
a
v
a
:
362
)
a
t
j
a
v
a
.
s
e
c
u
r
i
t
y
.
A
c
c
e
s
s
C
o
n
t
r
o
l
l
e
r
.
d
o
P
r
i
v
i
l
e
g
e
d
(
N
a
t
i
v
e
M
e
t
h
o
d
)
a
t
j
a
v
a
.
n
e
t
.
U
R
L
C
l
a
s
s
L
o
a
d
e
r
.
f
i
n
d
C
l
a
s
s
(
U
R
L
C
l
a
s
s
L
o
a
d
e
r
.
j
a
v
a
:
361
)
a
t
j
a
v
a
.
l
a
n
g
.
C
l
a
s
s
L
o
a
d
e
r
.
l
o
a
d
C
l
a
s
s
(
C
l
a
s
s
L
o
a
d
e
r
.
j
a
v
a
:
424
)
a
t
s
u
n
.
m
i
s
c
.
L
a
u
n
c
h
e
r
1.run(URLClassLoader.java:362) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:361) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at sun.misc.Launcher
1.run(URLClassLoader.java:362)atjava.security.AccessController.doPrivileged(NativeMethod)atjava.net.URLClassLoader.findClass(URLClassLoader.java:361)atjava.lang.ClassLoader.loadClass(ClassLoader.java:424)atsun.misc.LauncherAppClassLoader.loadClass(Launcher.java:335)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:348)
at fks_graphql_runner.xxxx.getFilesBySchemaName(xxxx.java:50)
at fks_graphql_runner.xxxx.main(xxxx.java:24)
Caused by: java.lang.ClassNotFoundException: com.xxxx.xxxx.xxxx.xxxx
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
… 16 more
FAILURE: Build failed with an exception.
Caused by: java.lang.ClassNotFoundException: com.xxxx.xxxx.xxxx.xxxx
Execution failed for task ‘:xxxx.main()’.
Process ‘command ‘C:/Program Files/Java/jdk1.8.0_131/bin/java.exe’’ finished with non-zero exit value 1
在路径下能找到该类,经过断点调试发现在Class.forName()报错。
解决方案一:
打开File->Settings->Build,Execution,Deployment->Build Tools->Gradle,将Run tests using改成InterlliJ IDEA。
解决方案二:
点击要运行的类的Edit Configurations,将Shorten command line选项改成JAR manifest。
类路径太长,或者您有许多VM参数,则无法启动该程序。原因是大多数操作系统都有命令行长度限制。在这种情况下,IntelliJ IDEA将尝试缩短类路径。
Shorten command line(缩短命令行)四个参数:
None: 这是默认选项。IDE不会缩短长类路径。如果命令行超出了操作系统限制,则IDEA将无法运行您的应用程序,但是工具提示将建议配置缩短器。
JAR Manifest: IDE通过临时classpath.jar传递长类路径。原始类路径在MANIFEST.MF中定义为classpath.jar中的类路径属性。
User-local default: 旧版属性。对于在此EAP之前创建的项目,将自动设置此选项。IDE将根据在idea / workspace.xml文件,属性:“ dynamic.classpath”和idea.config.path / options / options.xml文件,属性:“ idea”中设置的属性值来配置此设置。 dynamic.classpath.jar”。
classpath file: IDE将把长的类路径写入文本文件。
【官方文档】:https://blog.jetbrains.com/idea/2017/10/intellij-idea-2017-3-eap-configurable-command-line-shortener-and-more/
内心:第一次遇到的时候测试用IDEA运行就行,第二次再遇到弄了一整天,明明报的是NoClassDefFoundError,跟缩短命令行有什么关系????原本是认为依赖的scope问题,修改后还是无效。最后随便改改,居然瞎猫碰到死耗子。