标签: java-7

如何在本地安装的Java 7中将Play Framework与Google App Engine一起使用?

我刚刚下载了最新版本的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

java google-app-engine scala java-7 playframework

5
推荐指数
1
解决办法
2114
查看次数

MethodHandle示例在invokeExact调用时抛出WrongMethodTypeException

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 jvm invokedynamic java-7 methodhandle

5
推荐指数
1
解决办法
1441
查看次数

我们可以使用jdk7 javac将java7特性的代码编译成java6字节码

我正在考虑一个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中不起作用?我做错了什么,还是只是官方不支持?

谢谢.

java compatibility java-7

5
推荐指数
1
解决办法
3989
查看次数

Java 7在未安装JDK的情况下触发堆转储

如何在没有安装JDK的情况下为在Linux上运行的Java 7 VM触发堆转储?

在早期版本的Java中,可以设置-XX:+HeapDumpOnCtrlBreakJVM选项,然后使用触发堆转储kill -QUIT <pid>.我一直无法使用它来使用Java 7.是否有相同的功能而不需要安装JDK来获取JVisualVM或jmap.

java heap-dump java-7

5
推荐指数
1
解决办法
1895
查看次数

"尝试使用资源"功能用于File类

我有一个场景,我试图用Java 7'尝试资源'功能实现.

我的finally块包含一个BufferedWriter和的对象File,我想使用'try with resource'功能关闭它,而不是通过显式调用close方法来关闭它.

但是我检查了网络并看到File该类没有实现AutoCloseable接口,但BufferedWriter确实如此.那么如何管理这个场景来实现"试用资源"功能呢?

java file-io try-catch java-7

5
推荐指数
2
解决办法
9146
查看次数

在Java 7中通过HTTP检索XML

某些设备(例如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?

java xml http java-7

5
推荐指数
1
解决办法
233
查看次数

G1垃圾收集器调整

我在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)

performance garbage g1gc java-7

5
推荐指数
0
解决办法
826
查看次数

使用Java 7并行类加载器的Groovy MetaClass(相关)内存泄漏

问题背景

我运行一个Groovy/Grails系统,动态编译并加载用户定义的代码.这基本上是通过GroovyClassLoader.

我看到动态类本身都加载和卸载就好了.我添加了

-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled
Run Code Online (Sandbox Code Playgroud)

旗帜,工作正常.当类加载器是GC时,动态类正在卸载.

问题描述

但是我的堆内存泄漏,这是泄漏的来源:

jvisualvm截图

现在,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 groovy memory-leaks classloader java-7

5
推荐指数
0
解决办法
1443
查看次数

JDBC不兼容错误

我有一个用旧版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 ant jdbc java-6 java-7

5
推荐指数
1
解决办法
5291
查看次数

TimSort什么时候抱怨破坏的比较器?

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 timsort java-7

5
推荐指数
1
解决办法
1421
查看次数