更新:从Grails 1.3.6开始,可以从Gant脚本访问完整域.从Grails 1.3.6发行说明:
您现在可以使用run-script命令从命令行运行一个或多个Groovy脚本,例如
grails run-script [path-to-script-1] [path-to-script-2] ... [path-to-script-n]
这解决了Gant脚本中无法方便地访问应用程序类的问题,因为脚本启动时它们在类路径中不可用.
大家好,
我是新手使用Grails(在一个真实的项目中),我有一个我需要执行的一次性脚本,它读取一个文件,然后填充我的数据库.
我希望脚本在我的grails应用程序的上下文中运行,所以我使用了create-script命令.我现在明白这使它成为一个'Gant'脚本.这样做的原因是我认为它可以让我轻松访问所有grails域的优点,这样我就可以轻松地做到这样的事情:
Car car = new Car(model: 'bar', brand: 'Ford')
car.save()
Run Code Online (Sandbox Code Playgroud)
在这里,Car是我的一个域类,我从文件中检索到了字符串'bar'和'Ford'.
我的脚本的开头看起来像这样:
import com.foo.Car
grailsHome = Ant.project.properties."environment.GRAILS_HOME"
includeTargets << new File ( "${grailsHome}/scripts/Bootstrap.groovy" )
target(main: "a script for storing cars") {
depends(bootstrap, classpath) // code dealing with the file with cars follows
Run Code Online (Sandbox Code Playgroud)
令人惊讶的是,java.lang.NoClassDefFoundError: com.foo.Car当我使用命令执行脚本时,groovy给了我一个grails LoadCars
我采取了错误的方法,还是有一些更简单的我做错了?
任何帮助表示赞赏
我正在使用带有m2eclipse插件的eclipse helios.对于从CVS检出的maven项目,我如何告诉eclipse从pom中提到的依赖项中自动获取该项目所需的所有jar.
谢谢你的时间
当我在Eclipse中打开"打开类型"窗口时,ctrl + shift + T,我看到同一类型多次出现.类型具有完全相同的包和名称.为什么会这样做,我该如何解决?
我对这里发生的事情感到困惑.我一直得到以下异常:
Caused by: java.lang.ClassNotFoundException: org.jaxen.JaxenException
at java.net.URLClassLoader$1.run(URLClassLoader.java:217)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
at java.lang.ClassLoader.loadClass(ClassLoader.java:321)
at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
... 51 more
Run Code Online (Sandbox Code Playgroud)
然而,这个类文件在我耳边,也在我的ejb清单和我耳朵的清单文件的'Class-Path'属性中.有没有其他地方我需要添加jaxen jar让它被耳朵里的其他jar看到?耳朵里的所有罐子都有相同的类路径吗?
编辑#1
这也有:
Caused by: java.lang.NoClassDefFoundError: org/jaxen/JaxenException
at org.dom4j.DocumentFactory.createXPath(DocumentFactory.java:230)
at org.dom4j.tree.AbstractNode.createXPath(AbstractNode.java:207)
at org.dom4j.tree.AbstractNode.selectNodes(AbstractNode.java:164)
Run Code Online (Sandbox Code Playgroud)
编辑#2
我正在部署到glassfish v3.1并且lib jar位于ear文件的根目录,如下所示:
-foo.ear
--\META-INF
--lib1.jar
--lib2.jar
--jaxen-1.1.1.jar
Run Code Online (Sandbox Code Playgroud)
编辑#3
我已经尝试部署到另一个版本的GF,它似乎工作,我认为它可能是我正在使用的版本中的一个错误.我在这里开了一个论坛帖子.
编辑#4
我在app服务器lib目录中有dom4j但在服务器上没有jaxen.添加jaxen lib修复此问题.
我想为以下目录永久设置我的路径:
/Users/syalam/Library/android-sdk-mac_86/platform-tools
Run Code Online (Sandbox Code Playgroud)
不知道如何从终端做到这一点.我试过了:
export PATH=$PATH:/Users/syalam/Library/android-sdk-mac_86/platform-tools
Run Code Online (Sandbox Code Playgroud)
但它只是暂时的.关闭我的shell之后它就不再存在了.
我正在尝试获取我的应用程序类路径.
我有一个jar(名为application.jar),它在Manifest.mf中有其他jar文件,比如Class-Path: a.jar b.jar.
为什么当我使用System.getProperty("java.class.path")我的罐子a.jar和b.jar没有列出?
更新到最新的eclipse火星发布后
版本:Mars Release Candidate 1(4.5.0RC1)
Build id:20150521-1252
我无法启动任何Ant脚本.它总是会导致以下错误:

首先,我检查了路径是否真的正确,并确保特定的jar org.eclipse.swt.win32.win32.x86_64_3.104.0.v20150513-1901.jar存在于给定位置,它确实存在.经过一番挖掘后,我在外部工具配置中注意到以下内容:

不知何故,我认为eclipse无法使用库中url中给定的'%20'标记来解析类路径.通常只有一个空白.恢复默认值始终填写此特定库的'%20'.
所以我在一个没有空白的位置创建了一个eclipse副本,一切正常.
不幸的是,我宁愿保留位置,所以有没有办法正确解决附加任务和支持的类路径?
到目前为止,我没有成功地搜索了这个问题的解决方案.
我们正在将我们的应用程序迁移到EAP 6.4.0,我们的应用程序依赖于JPA 2.1.但是,JBoss是一个Java EE 6服务器,因此包含模块形式的JPA 2.0.
我尝试将JPA API jar直接包含在我的WEB-INF/lib目录中,认为类加载器比系统中的那个更喜欢这个.
我试图在我的耳朵中包含一个jboss-deployment-structure.xml文件.我在耳朵/ META-INF,ear/war/META-INF和ear/war/WEB-INF下试了一下.
在jboss-deployment-structure.xml文件中,我尝试:排除javax.persistence.api模块使用JPA 2.1创建我自己的模块并向其添加依赖项,排除jpa子系统
我还尝试在位于jboss-eap-6.4.0\modules\system\layers\base\javax\persistence\api\main下的javax.persistence.api module.xml文件中将export属性设置为false.
我尝试从standalone.xml中删除jpa子系统.
所有这些都导致了JPA 2.0 jar的使用.
我让它工作的唯一方法是替换模块目录中的实际jar(jboss-eap-6.4.0\modules\system\layers\base\javax\persistence\api\main).但这不是一个有效的解决方案,因为服务器中的其他应用程序或服务实际上可能需要旧版本的API.
有没有办法正确地做到这一点(没有迁移到另一台服务器,也没有更改代码)?
我遵循了Gradle指南来构建Java 9模块,从而使一个简单的基于Java 9的库项目成为现实。特别是,我按照指南中的建议手动设置了模块路径,如下所示:
ext.moduleName = 'com.foo.bar'
compileJava {
inputs.property("moduleName", moduleName)
doFirst {
options.compilerArgs = [
'--module-path', classpath.asPath,
]
classpath = files()
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,这只是获取我的整个类路径(由Gradle从我的依赖图中确定),并将其移到模块路径中。
除了一个简单的问题以外,一切工作都很好。我的某些依赖项(例如 org.jetbrains.kotlin:kotlin-stdlib-1.2.10)不是真正的Java 9模块,因为它们缺少module-info.class。它的优良坚持他们的类路径上或模块路径,因为,现在,java将它们转换成所谓的自动模块。
问题就出现了,因为即使是一个自动模块,如果是我的模块的道路上,我需要参考它在requires指令中我的项目的模块。但是由于我-Xlint:all选择了Java编译器,因此会javac产生以下警告:
/path/to/myproject/foo-module/src/main/java/module-info.java:26: warning: requires directive for an automatic module
requires kotlin.stdlib;
^
Run Code Online (Sandbox Code Playgroud)
这个警告对我来说是站不住脚的,因为我也随该-Werror javac标志滚动,因此它使我的构建失败。
因此,似乎我需要将自动模块推送到我的类路径上,并仅在模块路径上保留“ true”模块依赖项...
是否有任何通用或半通用的方式(即未与依赖项名称耦合)在编译器类路径及其模块路径之间拆分我的依赖项?
classpath gradle java-platform-module-system java-9 module-path
以下示例项目a:
project-a
-src/main/
-java/
-test/
-Test.java
module-info.java
-resources
...
pom.xml
Run Code Online (Sandbox Code Playgroud)
pom.xml:
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>test</groupId>
<artifactId>test1</artifactId>
<version>0.0.1-SNAPSHOT</version>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>javax.json</groupId>
<artifactId>javax.json-api</artifactId>
<version>1.1.4</version>
</dependency>
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>javax.json</artifactId>
<version>1.1.4</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<release>11</release>
</configuration>
</plugin>
</plugins>
</build>
</project>
Run Code Online (Sandbox Code Playgroud)
module-info.java:
module test1 {
exports test;
requires transitive java.json;
}
Run Code Online (Sandbox Code Playgroud)
当我运行eclipse [项目> maven>更新项目]时,所有依赖项都添加到类路径中。但是工件javax.json-api必须位于modulepath(api是模块)上,另一个必须位于classpath(该api的实现不是模块)上。
我该怎么做呢?
(我正在使用Eclipse 2018-12,OpenJDK 11和Maven 3.6.0)
类Test的示例代码:
package test;
import java.io.StringWriter;
import java.util.HashMap;
import java.util.Map;
import javax.json.Json; …Run Code Online (Sandbox Code Playgroud) classpath ×10
eclipse ×4
java ×4
maven ×2
ant ×1
bash ×1
classloader ×1
dependencies ×1
environment ×1
gant ×1
gradle ×1
grails ×1
java-11 ×1
java-9 ×1
java-ee ×1
java-platform-module-system ×1
jboss ×1
jpa ×1
macos ×1
manifest.mf ×1
module-path ×1
pom.xml ×1
shell ×1
terminal ×1
types ×1