我刚刚下载了最新版本的Play Framework(1.2.3),并将其与最新的Scala插件(0.9.1)和Google App Engine模块(1.4)一起使用.
默认应用程序在本地工作正常(在localhost:9000,默认端口).我还成功地使用了GAE发布了默认应用程序play gae:deploy.
但是,当我转到GAE远程URL时,我收到标准错误消息:
Error: Server Error.
The server encountered an error and could not complete your request.
If the problem persists, please report your problem and mention this error message and the query that caused it.
Run Code Online (Sandbox Code Playgroud)
以下是GAE日志中的完整堆栈跟踪:https://gist.github.com/1181257
我猜第一个错误,NPE,是由于可以很容易修复的东西,所以现在忽略它; 但请注意第二个 - 关键 - 错误,它说:
java.lang.UnsupportedClassVersionError: helpers/CheatSheetHelper$1 : Unsupported major.minor version 51.0
Run Code Online (Sandbox Code Playgroud)
51.0是(我认为)Java 7编译器生成的类版本.现在,我的问题很简单:
如何强制Play Framework及其Scala插件使用-target 1.6和-source 1.6选项编译GAE发布类,以便输出类与1.6兼容,而不是默认值,这使得本地Java 7安装生成1.7输出类?
谢谢.
[编辑]至于NPE,似乎没有抛出Play 1.2.1和Scala插件的0.9版本:使用scala和GAE的Play框架 - 再次,这只是一个侧面问题,主要问题(获取Java) 7工作)仍然站立.我为此创建了一张票:http://play.lighthouseapp.com/projects/74274-play-scala/tickets/45-nullpointerexception-on-google-app-engine
MethodHandle类的描述中显示的示例在使用以下描述WrongMethodTypeException的语句调用中抛出a mh.invokeExact("daddy",'d','n'): (CC)Ljava/lang/String; cannot be called with a different arity as ([Ljava/lang/Object;)Ljava/lang/Object;.
该MethodHandle对象mh具有对应于的符号类型描述符:(CC)Ljava/lang/String.但是当我们调用时mh.invokeExact("daddy",'d','n'),参数:d并n作为Object数组传递,然后它们与该类型的参数不匹配char.
我知道我可以使用invokeWithArguments而不是invokeExcat或者解决上述问题invoke,但是这个例子应该像MethodHandleJava 7 API 的描述中所说的那样工作.除此之外,它invokeWithArguments具有与invoke/ 相关的性能开销invokeExact.
我正在考虑一个java项目是否可以生成2个jar:一个用于java7,一个用于java6,是的,源代码可能会使用一些java7新功能.
所以要生成java6 jar,命令行就像:
javac -target 1.6 -bootclasspath jdk1.6.0\lib\rt.jar -extdirs "" MyApp.java
Run Code Online (Sandbox Code Playgroud)
不幸的是,它只是发出一个错误:
javac: target release 1.6 conflicts with default source release 1.7
Run Code Online (Sandbox Code Playgroud)
根据这个文件,应该有可能jdk6 vs jdk5,任何人都知道为什么它在jdk7 vs jdk6中不起作用?我做错了什么,还是只是官方不支持?
谢谢.
如何在没有安装JDK的情况下为在Linux上运行的Java 7 VM触发堆转储?
在早期版本的Java中,可以设置-XX:+HeapDumpOnCtrlBreakJVM选项,然后使用触发堆转储kill -QUIT <pid>.我一直无法使用它来使用Java 7.是否有相同的功能而不需要安装JDK来获取JVisualVM或jmap.
我有一个场景,我试图用Java 7'尝试资源'功能实现.
我的finally块包含一个BufferedWriter和的对象File,我想使用'try with resource'功能关闭它,而不是通过显式调用close方法来关闭它.
但是我检查了网络并看到File该类没有实现AutoCloseable接口,但BufferedWriter确实如此.那么如何管理这个场景来实现"试用资源"功能呢?
某些设备(例如webrelay)返回原始XML以响应HTTPGet请求.也就是说,回复不包含有效的HTTP标头.多年来,我使用以下代码从这些设备中检索信息:
private InputStream doRawGET(String url) throws MalformedURLException, IOException
{
try
{
URL url = new URL(url);
HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.setConnectTimeout(5000);
con.setReadTimeout(5000);
return con.getInputStream();
}
catch (SocketTimeoutException ex)
{
throw new IOException("Timeout attempting to contact Web Relay at " + url);
}
}
Run Code Online (Sandbox Code Playgroud)
在openJdk 7中,sun.net.www.protocol.http.HttpURLConnection添加了以下行,这意味着任何带有无效标头的HTTP响应都会生成IOException:
1325 respCode = getResponseCode();
1326 if (respCode == -1) {
1327 disconnectInternal();
1328 throw new IOException ("Invalid Http response");
1329 }
Run Code Online (Sandbox Code Playgroud)
如何从Java 7新世界中需要HTTPGet请求的服务器获取"无头"XML?
我在Hotspot JVM上运行Java 7 update 45上的应用程序.我试图调整参数以适应低延迟应用程序,下面是我为此次运行设置的JVM参数.GC日志中各个步骤的时间(约25ms)不会累计到暂停时间(> 600ms).我怎么知道是什么导致这个暂停时间如此之高?在大多数收藏中,他们加起来很好,并且在暂停时间目标中.我偶尔会看到如此大的停顿,一次在15-20分钟左右(虽然不是那么规律).
-server -Xmx2g -Xms2g -XX:PermSize = 128m -XX:MaxPermSize = 128m -XX:+ UseG1GC -XX:MaxGCPauseMillis = 30 -XX:ParallelGCThreads = 9 -XX:ConcGCThreads = 4 -XX:G1HeapRegionSize = 4M -XX: InitiatingHeapOccupancyPercent = 45 -XX:+ PrintTLAB -XX:+ AggressiveOpts -Xloggc:/integral/logs/gc.log -verbose:gc -XX:+ PrintTenuringDistribution -XX:+ PrintGCDateStamps -XX:+ PrintAdaptiveSizePolicy -XX:+ PrintGCDetails -XX :+ PrintGCApplicationConcurrentTime -XX:+ PrintGCApplicationStoppedTime -XX:+ PrintSafepointStatistics -XX:PrintSafepointStatisticsCount = 1 -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port = 3026 -Dcom.sun.management.jmxremote.local. only = false -Dcom.sun.management.jmxremote.authenticate = false -Dcom.sun.management.jmxremote.ssl = false"
2014-01-28T16:16:12.084+0000: 27507.054: Application time: 8.9506630 seconds
2014-01-28T16:16:12.084+0000: 27507.055: [GC …Run Code Online (Sandbox Code Playgroud) 我运行一个Groovy/Grails系统,动态编译并加载用户定义的代码.这基本上是通过GroovyClassLoader.
我看到动态类本身都加载和卸载就好了.我添加了
-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled
Run Code Online (Sandbox Code Playgroud)
旗帜,工作正常.当类加载器是GC时,动态类正在卸载.
但是我的堆内存泄漏,这是泄漏的来源:

现在,Launcher$AppClassLoader有一个parallelLockMap定义的属性java.lang.ClassLoader.显然,这ConcurrentHashMap用于在Java 7中保存并行类加载锁.查看源代码.
此映射中保留的条目具有String键(锁定适用的类名称)和Object值(锁定对象).有两种泄漏密钥:
"groovy.runtime.metaclass.MyDynamicallyLoadedClassNameMetaClass"
"MyDynamicallyLoadedClassNameBeanInfo"
Run Code Online (Sandbox Code Playgroud)
所以对我来说,看起来这些键是在加载和类parallelLockMap时创建的,但是当卸载关联的动态加载的类(及其元类)时,它们不会被删除.现在,这已经深入到Groovy及其元类系统的内部,我的专业知识已经耗尽.*MetaClass*BeanInfo
这最终会让你离开堆空间,尽管需要一段时间:
String newClass = "class CLASSNAME {}"
while (true) {
GroovyClassLoader gcl = new GroovyClassLoader()
Class clazz = gcl.parseClass(newClass.replace("CLASSNAME", "NewClass"+System.nanoTime()))
clazz.newInstance()
}
Run Code Online (Sandbox Code Playgroud)
确保使用上面的JVM标志运行它,以便用尽堆空间,而不是PermGen空间.再次,PermGen很好地收集垃圾,没有泄漏.

1)这是Groovy或Java 7中的错误吗?清洁这个是谁的责任parallelLockMap?我应该提交问题报告吗?
2)有解决方法吗?我正在考虑使用一个自定义ClassLoader,它不会首先尝试将类加载委托给它们的父级以用于这些MetaClass和BeanInfo类,从而阻止了对它的调用java.lang.ClassLoader#loadClass(..).不过,我不是Java/Groovy类加载方面的专家.
编辑:我在这里提交了一个Groovy JIRA …
我有一个用旧版java编写的遗留代码.我正在尝试编译代码并使用ant生成.ear文件.我正在使用的java版本是jdk7/jdk6作为java home.在执行ant脚本时,我收到以下错误
Compiling 20 source files to C:\views\kroger\kroger\of_platform\build\oneforce\classes\ra
warning: [options] bootstrap class path not set in conjunction with -source 1.4
C:\views\kroger\kroger\of_platform\sdk\src\java\ra\com\workscape\connector\wedb\
JdbcConnectionImpl.java:81: error: JdbcConnectionImpl is not abstract and does not override abstract method getNetworkTimeout() in Connection
public class JdbcConnectionImpl implements JdbcConnection {
C:\views\kroger\kroger\of_platform\sdk\src\java\ra\com\workscape\connector\wedb\
JdbcDataSource.java:78: error: JdbcDataSource is not abstract and does not override abstract method getParentLogger() in CommonDataSource
public class JdbcDataSource
Run Code Online (Sandbox Code Playgroud)
我假设这个错误是因为某些jar不兼容较新的jdk版本.当我使用jdk1.4/1.5时,这很好用.请让我知道,如果我需要采取任何最新版本的jar ..使用的数据库是oracle,我使用ojdbc14编译数据库java代码.
它很重要,因为我们必须决定我们需要使用哪个版本的java.
谢谢
Java 7 更改了排序算法,使其抛出一个
java.lang.IllegalArgumentException:"比较方法违反了它的一般合同!"
在某些情况下,使用的比较器是有缺陷的.是否可以判断比较器中的哪种错误导致这种情况?在我的实验中,如果x!= x无关紧要,如果x <y和y <z但z <x也没关系,但是如果x = y且y = z但是x <z对于某些值确实很重要x,y,z.这通常是这样吗?
(如果对此有一般规则,可能更容易在比较器中查找错误.但当然最好修复所有错误.:-))
特别是,以下两个比较器没有让TimSort抱怨:
final Random rnd = new Random(52);
Comparator<Integer> brokenButNoProblem1 = new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
if (o1 < o2) {
return Compare.LESSER;
} else if (o1 > o2) {
return Compare.GREATER;
}
return rnd.nextBoolean() ? Compare.LESSER : Compare.GREATER;
}
};
Comparator<Integer> brokenButNoProblem2 = new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
if (o1 == o2) …Run Code Online (Sandbox Code Playgroud) java-7 ×10
java ×9
ant ×1
classloader ×1
file-io ×1
g1gc ×1
garbage ×1
groovy ×1
heap-dump ×1
http ×1
java-6 ×1
jdbc ×1
jvm ×1
memory-leaks ×1
methodhandle ×1
performance ×1
scala ×1
timsort ×1
try-catch ×1
xml ×1