我正在尝试创建一个"可执行"war文件(java -jar myWarFile.war),它将启动一个Jetty网络服务器,它托管我执行的WAR文件中包含的webapp.
我找到了一个页面,描述了如何制作我正在寻找的东西:
然而,遵循这个建议,以及我认为我应该制作一个可执行jar(战争)是不行的.
我有一个Ant任务创建一个带有清单的WAR文件,如下所示:
Run Code Online (Sandbox Code Playgroud)Manifest-Version: 1.0 Ant-Version: Apache Ant 1.7.1 Created-By: 1.5.0_18-b02 (Sun Microsystems Inc.) Main-Class: Start
WAR文件的内容如下所示:
> Start.class
> jsp
> build.jsp
> META-INF
> MANIFEST.MF
> WEB-INF
> lib
> jetty-6.1.22.jar
> jetty-util.6.1.22.jar
Run Code Online (Sandbox Code Playgroud)
当我尝试执行WAR文件时,错误是:
Exception in thread "main" java.lang.NoClassDefFoundError: org/mortbay/jetty/Handler
Caused by: java.lang.ClassNotFoundException: org.mortbay.jetty.Handler
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
Could not find the main class: Start. Program will exit.
Run Code Online (Sandbox Code Playgroud)
这里似乎有两个错误:一个似乎无法找到JAR文件,另一个找不到Start类.
为了修复第一个,我将Jetty …
我有一组在tomcat下运行的webapps.使用-Xmx参数将Tomcat配置为具有多达2 GB的内存.
许多Web应用程序需要执行最终使用以下代码的任务:
Runtime runtime = Runtime.getRuntime();
Process process = runtime.exec(command);
process.waitFor();
...
Run Code Online (Sandbox Code Playgroud)
我们遇到的问题与在Linux上创建这个"子进程"的方式有关(Redhat 4.4和Centos 5.4).
我的理解是,等于tomcat使用量的内存量需要在物理(非交换)系统内存池中自由,最初才能创建此子进程.当我们没有足够的免费物理内存时,我们得到了这个:
java.io.IOException: error=12, Cannot allocate memory
at java.lang.UNIXProcess.<init>(UNIXProcess.java:148)
at java.lang.ProcessImpl.start(ProcessImpl.java:65)
at java.lang.ProcessBuilder.start(ProcessBuilder.java:452)
... 28 more
Run Code Online (Sandbox Code Playgroud)
我的问题是:
1) 是否可以删除与物理内存中空闲进程相等的内存量的要求? 我正在寻找一个答案,允许我指定子进程获取多少内存或允许java上的java访问交换内存.
2) 如果没有#1的解决方案,Runtime.getRuntime().exec()有哪些替代方案? 我只能想到两个,这两个都不是很理想.JNI(非常不可取)或重写我们在java中调用的程序,并使其成为webapp以某种方式与之通信的自己的进程.必须有其他人.
3) 这个问题的另一面是否有可能解决这个问题? 降低tomcat使用的内存量不是一种选择.增加服务器上的内存总是一种选择,但似乎更像是一个创可贴.
服务器正在运行java 6.
编辑:我应该指定我不是在寻找特定于tomcat的修复程序.我们在网络服务器上运行的任何java应用程序都可以看到这个问题(有多个).我只是使用tomcat作为一个例子,因为它很可能会分配最多的内存,而这正是我们第一次看到错误的地方.这是一个可重现的错误.
编辑:最后,我们通过重写系统调用在java中执行的操作来解决此问题.我觉得我们很幸运能够在不进行额外系统调用的情况下完成此操作.并非所有流程都能够做到这一点,所以我仍然希望看到一个实际的解决方案.
我有一个活动和服务在我的应用程序中一起工作.我已将服务配置为远程服务(已实现的AIDL),因此即使活动不可见,它也会继续运行.
该服务负责轮询服务器以获取数据,并在满足特定条件时发送警报通知.我不希望服务在活动可见时发送这些通知.
服务是否有办法了解任何特定活动的状态?特别是一项与之相关的活动?
使用清单更新以解决权限问题:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.interact.listen.android.voicemail"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".MyAppName"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".MyObjectDetails"/>
<service android:enabled="true" android:name=".MyService" />
<receiver android:name=".MyReceiver">
<intent-filter>
<action android:name="com.foo.bar.EVENT"/>
</intent-filter>
</receiver>
</application>
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
</manifest>
Run Code Online (Sandbox Code Playgroud)
我在Logcat中遇到的错误:
09-17 15:33:17.881: WARN/ActivityManager(53): Permission Denial: receiving Intent { act=com.foo.bar.myobject.EVENT (has extras) } to ProcessRecord{43928b40 223:com.foo.bar.myobject/10022} (pid=223, uid=10022) requires com.foo.bar.myobject.EVENT due to sender com.foo.bar.myobject (uid 10022)
09-17 15:33:48.901: WARN/ActivityManager(53): Permission Denial: receiving Intent { act=com.foo.bar.myobject.EVENT (has …Run Code Online (Sandbox Code Playgroud) 我试图采取多个多页.tif文件,并将它们组合成一个单页多页tif文件.
我在这个问题中找到了一些代码,但它似乎只占用了每个单独的.tif文件的第一页,并用这些第一页创建了新的多页.tif.
是否有一个小的改变,我没有看到会导致相同的代码从源.tif文件中获取每个页面并将它们全部放入组合的.tif?
为了澄清,我想要源文件:
合并成
我还希望能够指定.tif的分辨率和压缩,但我不确定JAI是否支持它,并且它不是正确答案的必要条件.
我修改了引用问题中的代码以加载目录中的所有.tif文件,以便于回答:
public static void main(String[] args) {
String inputDir = "C:\\tifSources";
File sourceDirectory = new File(inputDir);
File file[] = sourceDirectory.listFiles();
int numImages = file.length;
BufferedImage image[] = new BufferedImage[numImages];
try
{
for (int i = 0; i < numImages; i++)
{
SeekableStream ss = new FileSeekableStream(file[i]);
ImageDecoder decoder = ImageCodec.createImageDecoder("tiff", ss, null);
PlanarImage op = new NullOpImage(decoder.decodeAsRenderedImage(0), null, null, OpImage.OP_IO_BOUND);
image[i] = op.getAsBufferedImage();
}
TIFFEncodeParam params = new …Run Code Online (Sandbox Code Playgroud) phpunit已停止支持PEAR安装.这导致我们需要使用phpunit的phar安装前进.我们有一个包装脚本,遍历许多目录并在这些目录上调用phpunit可执行文件.然后,包装脚本将所有生成的报告合并到一个报告中.
当phpunit与PEAR一起安装时,我们在包装脚本顶部需要的唯一要求是
require 'PHP/CodeCoverage/Autoload.php';
然后,当包装脚本做了类似的事情
$writer = new PHP_CodeCoverage_Report_Clover();
$writer->process($codeCoverage, "${reportsDir}/clover-coverage.xml");
Run Code Online (Sandbox Code Playgroud)
自动加载器(可能)会加载执行此代码所需的任何内容,我们将以愉快的方式继续运行.
然而,自从转移到phar安装之后,事情变得一团糟.最初我以为我可以只需要phar文件,一切都会好的.
require 'phpunit-3.7.31.phar';
但是,这会导致在命中行被命中时立即执行phar文件,并使用phpunit用法输出中止包装脚本.由于您无法在php require语句中使用通配符,因此我慢慢构建了完成包装脚本所需的文件列表,并且需要它们如下所示:
require 'phar://phpunit-3.7.31.phar/php-code-coverage/CodeCoverage/Report/Clover.php';
当我从它的目录执行包装脚本并且phpunit.phar文件在同一目录中时,这个工作.但是,尝试从其他目录执行它将无法说明在包含路径上找不到phar文件.我试图更改包含路径,将.phar文件放在已包含路径上的位置,并在包含中指定phar文件的绝对路径:
require 'phar://actual/path/to/file/phpunit-3.7.31.phar/php-code-coverage/CodeCoverage/Report/Clover.php';
这些尝试解决我的问题都没有奏效.
如何以一种允许我从系统上的任何位置运行脚本的方式包含.phar文件中的文件?
另一个可接受的答案是允许我使用phar文件中的类而不包括我需要的所有内容.
Ubuntu 12.04
PHPUnit 3.7.31(我们必须保留这个版本,但这并不会真正影响这个问题)