在使用mvn任务运行jetty:stop命令时,在控制台中出现以下ant错误,
[artifact:mvn] org.apache.tools.ant.ExitException: Permission (java.lang.RuntimePermission exitVM) was not granted.
[artifact:mvn] at org.apache.tools.ant.types.Permissions$MySM.checkExit(Permissions.java:196)
[artifact:mvn] at java.lang.Runtime.exit(Runtime.java:88)
[artifact:mvn] at java.lang.System.exit(System.java:904)
[artifact:mvn] at org.codehaus.classworlds.Launcher.main(Launcher.java:376)
[artifact:mvn] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[artifact:mvn] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
[artifact:mvn] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
[artifact:mvn] at java.lang.reflect.Method.invoke(Method.java:597)
[artifact:mvn] at org.apache.tools.ant.taskdefs.ExecuteJava.run(ExecuteJava.java:217)
[artifact:mvn] at org.apache.tools.ant.taskdefs.ExecuteJava.execute(ExecuteJava.java:152)
[artifact:mvn] at org.apache.tools.ant.taskdefs.Java.run(Java.java:764)
[artifact:mvn] at org.apache.tools.ant.taskdefs.Java.executeJava(Java.java:218)
[artifact:mvn] at org.apache.tools.ant.taskdefs.Java.executeJava(Java.java:132)
[artifact:mvn] at org.apache.tools.ant.taskdefs.Java.execute(Java.java:105)
[artifact:mvn] at org.apache.maven.artifact.ant.Mvn.execute(Mvn.java:81)
[artifact:mvn] at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:288)
[artifact:mvn] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[artifact:mvn] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
[artifact:mvn] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
[artifact:mvn] at java.lang.reflect.Method.invoke(Method.java:597)
[artifact:mvn] at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
[artifact:mvn] at org.apache.tools.ant.Task.perform(Task.java:348)
[artifact:mvn] at org.apache.tools.ant.Target.execute(Target.java:357)
[artifact:mvn] at org.apache.tools.ant.Target.performTasks(Target.java:385)
[artifact:mvn] at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1337)
[artifact:mvn] at org.apache.tools.ant.Project.executeTarget(Project.java:1306)
[artifact:mvn] at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41)
[artifact:mvn] at org.apache.tools.ant.Project.executeTargets(Project.java:1189)
[artifact:mvn] at org.apache.tools.ant.Main.runBuild(Main.java:758)
[artifact:mvn] at org.apache.tools.ant.Main.startAnt(Main.java:217)
[artifact:mvn] at org.apache.tools.ant.launch.Launcher.run(Launcher.java:257)
[artifact:mvn] at org.apache.tools.ant.launch.Launcher.main(Launcher.java:104)
在搜索此错误时,我收到了类似的帖子,
https://stackoverflow.com/a/8588201/1793718
https://issues.apache.org/jira/browse/MANTTASKS-201
https://readthefuckingmanual.net/error/1010/
建议设置fork="true"
可以解决问题,但是当我的fork设置为true(甚至是假)时,我收到此错误
下面是调用stop jetty服务器的蚂蚁目标,
<target name="jetty-stop" fork="true">
<artifact:mvn mavenHome="${maven.home}">
<jvmarg value="-Xmx1024m" />
<arg value="jetty:stop"/>
</artifact:mvn>
</target>
更新:
我在初始化c3p0时也注意到错误消息,与此问题中提到的相同,
java.security.AccessControlException when using Ant, but runs ok when invoking java from console
使用以下ant-task启动服务器时
<target name="jetty-start-jdk8">
<delete dir="war/WEB-INF/lib"/>
<artifact:mvn mavenHome="${maven.home}" fork="true">
<jvmarg value="-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000" />
<jvmarg value="-javaagent:${jrebel.path}" />
<jvmarg value="-Xbootclasspath/p:C:/Users/admin/AppData/Local/Temp//rebelboot.jar" />
<arg value="compile"/>
<arg value="war:exploded"/>
<arg value="jetty:run"/>
</artifact:mvn>
</target>
上述帖子还建议设置fork="true"
来解决它。但它已经设定为真。这可能是什么问题?
答案 0 :(得分:2)
解决方案:
在构建路径中使用JDK而不是JRE。
问题是我的项目是在eclipse中使用JRE而不是JDK配置的,而build.xml正在提取我的项目配置,这是一个JRE。出于某些原因,使用JRE作为系统库运行ant任务。更改为JDK 1.8解决了这个问题。更改构建路径后,从Ant视图中删除Build.XML并再次添加以运行任务。
答案 1 :(得分:0)
System.exit()调用直接与JVM对话,导致它立即死亡。由于从Ant运行的Java程序正在Ant的JVM中运行,因此对System.exit()的任何调用都会杀死Ant的JVM。
由于您尝试调用杀死蚂蚁的JVM,因此您可能没有权限。
可以在类执行期间通过嵌套权限元素撤销和授予安全权限。有关更多信息,请参见https://svn.apache.org/repos/asf/ant/core/trunk/manual/Types/permissions.html
当未授予(或已撤消)RuntimePermission exitVM许可时,System.exit()调用将被拦截并按照failonerror中的指示进行处理。
您可以在Java任务中提供
<java classname="org.stackoverflow.SpecialTool" fork="true">
<permissions>
<grant class="java.security.AllPermission"/>
</permissions>
</java>
OR
java任务具有一个名为fork的属性。
<java classname="org.stackoverflow.SpecialTool" fork="true"/>
java任务上的fork属性使您能够避免此问题。该属性告诉java任务在单独的JVM中运行该类。位于单独的JVM中意味着该程序的System.exit()调用无法杀死Ant的JVM。