Home » Newcomers » Newcomers » accessing classpath of workspace from plugin
accessing classpath of workspace from plugin [message #243946] |
Mon, 24 December 2007 12:09  |
Eclipse User |
|
|
|
Originally posted by: aryeh.friedman.gmail.com
A plugin (view) that reads the class name selected in the package explorer
(correctly) but when I go to actually load the class it fails... here is
the method in question:
package eclipse.views;
import java.util.List;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IType;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.ISelectionListener;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.part.ViewPart;
// all this is from my app (external to eclipse)
import dev.thistest.core.Event;
import dev.thistest.core.EventListener;
import dev.thistest.core.Result;
import dev.thistest.core.Settings;
import dev.thistest.core.TestSuite;
import dev.thistest.core.TestType;
import dev.thistest.ui.Loader;
public class SampleView extends ViewPart implements ISelectionListener,
EventListener
{
public void testPerformed(Event event)
{
System.out.println(event);
}
public void selectionChanged(IWorkbenchPart part, ISelection selection)
{
IStructuredSelection isel=(IStructuredSelection) selection;
if(isel==null)
return;
IJavaElement elem=(IJavaElement) isel.getFirstElement();
if(elem==null)
return;
IType itype=(IType) elem;
if(!(elem instanceof IType))
return;
String name=null;
try {
if(!itype.getSuperclassName().equals("TestSuite"))
return;
name=itype.getFullyQualifiedName();
} catch(Throwable e) {
e.printStackTrace();
}
Settings.addSetting("TestType",TestType.All);
Settings.addSetting("EventListener",this);
Class klass=null;
try {
klass=this.getClass().getClassLoader().loadClass(name);
} catch(ClassNotFoundException e) {
}
Object inst=null;
System.out.println(klass);
try {
inst=klass.newInstance();
} catch(InstantiationException e) {
} catch(IllegalAccessException e) {
}
TestSuite theTest=(TestSuite) inst;
toggleRun();
theTest.run();
testCount=(Integer) Settings.getSetting("TestCount");
toggleRun();
theTest.run();
System.out.println(theTest.getResult());
}
public void createPartControl(Composite parent)
{
getSite().getPage().addSelectionListener(this);
}
public void setFocus()
{
}
private void toggleRun()
{
Settings.addSetting("RunTest",!(Boolean) Settings.getSetting("RunTest"));
}
private int testCount=0;
private List<TestSuite> tests;
}
and when I attempt to load this class in a sub-eclipse instance get null
for the println when I click on the following class file:
package arf;
import dev.thistest.core.TestSuite;
public class aef extends TestSuite
{
public void run()
{
System.out.println("hi there");
}
}
Note I have exported all the dev stuff in the MANIFEST and have set the
classpath in the test instance (it used to say class not found so I know
it finds it)
|
|
|
Re: accessing classpath of workspace from plugin [message #243968 is a reply to message #243946] |
Mon, 24 December 2007 13:10   |
Eclipse User |
|
|
|
Originally posted by: cboe.news.eclipse.org
On Mon, 2007-12-24 at 17:09 +0000, Aryeh M. Friedman wrote:
> A plugin (view) that reads the class name selected in the package explorer
> (correctly) but when I go to actually load the class it fails... here is
This is because the classes that are being developed in a workbench
aren't on the classpath of the Eclipse plugin. It looks like you are
trying to run code under development into the currently running Eclipse
instance. This is very dangerous. You have no control over the code
that is called in the classes that are loaded. For instance, if the
code you are loading has a System.exit() call, it will cause Eclipse to
exit without warning.
If you need to run code that is being developed in a workbench, you
should probably look into the launch support. This will allow you to
launch a separate VM to run the code. That way your Eclipse instance
will be protected from problem code. You should probably take a look at
the JUnit plugins for running test cases. I'm guessing that these are
close to what you are trying to do.
> the method in question:
>
> package eclipse.views;
>
>
> import java.util.List;
>
> import org.eclipse.jdt.core.IJavaElement;
> import org.eclipse.jdt.core.IType;
> import org.eclipse.jface.viewers.ISelection;
> import org.eclipse.jface.viewers.IStructuredSelection;
> import org.eclipse.swt.widgets.Composite;
> import org.eclipse.ui.ISelectionListener;
> import org.eclipse.ui.IWorkbenchPart;
> import org.eclipse.ui.part.ViewPart;
>
> // all this is from my app (external to eclipse)
> import dev.thistest.core.Event;
> import dev.thistest.core.EventListener;
> import dev.thistest.core.Result;
> import dev.thistest.core.Settings;
> import dev.thistest.core.TestSuite;
> import dev.thistest.core.TestType;
> import dev.thistest.ui.Loader;
>
> public class SampleView extends ViewPart implements ISelectionListener,
> EventListener
> {
> public void testPerformed(Event event)
> {
> System.out.println(event);
> }
>
> public void selectionChanged(IWorkbenchPart part, ISelection selection)
> {
> IStructuredSelection isel=(IStructuredSelection) selection;
>
> if(isel==null)
> return;
>
> IJavaElement elem=(IJavaElement) isel.getFirstElement();
>
> if(elem==null)
> return;
>
> IType itype=(IType) elem;
>
> if(!(elem instanceof IType))
> return;
>
> String name=null;
>
> try {
> if(!itype.getSuperclassName().equals("TestSuite"))
> return;
>
> name=itype.getFullyQualifiedName();
> } catch(Throwable e) {
> e.printStackTrace();
> }
>
> Settings.addSetting("TestType",TestType.All);
> Settings.addSetting("EventListener",this);
>
> Class klass=null;
>
> try {
> klass=this.getClass().getClassLoader().loadClass(name);
> } catch(ClassNotFoundException e) {
> }
>
> Object inst=null;
>
> System.out.println(klass);
>
> try {
> inst=klass.newInstance();
> } catch(InstantiationException e) {
> } catch(IllegalAccessException e) {
> }
>
> TestSuite theTest=(TestSuite) inst;
>
> toggleRun();
> theTest.run();
> testCount=(Integer) Settings.getSetting("TestCount");
> toggleRun();
>
> theTest.run();
> System.out.println(theTest.getResult());
> }
>
> public void createPartControl(Composite parent)
> {
> getSite().getPage().addSelectionListener(this);
> }
>
> public void setFocus()
> {
> }
>
> private void toggleRun()
> {
> Settings.addSetting("RunTest",!(Boolean) Settings.getSetting("RunTest"));
> }
>
> private int testCount=0;
> private List<TestSuite> tests;
> }
>
> and when I attempt to load this class in a sub-eclipse instance get null
> for the println when I click on the following class file:
>
> package arf;
>
> import dev.thistest.core.TestSuite;
>
> public class aef extends TestSuite
> {
> public void run()
> {
> System.out.println("hi there");
> }
>
> }
>
> Note I have exported all the dev stuff in the MANIFEST and have set the
> classpath in the test instance (it used to say class not found so I know
> it finds it)
>
|
|
|
Re: accessing classpath of workspace from plugin [message #243977 is a reply to message #243968] |
Mon, 24 December 2007 13:46   |
Eclipse User |
|
|
|
Originally posted by: aryeh.friedman.gmail.com
David Wegener wrote:
> On Mon, 2007-12-24 at 17:09 +0000, Aryeh M. Friedman wrote:
>> A plugin (view) that reads the class name selected in the package explorer
>> (correctly) but when I go to actually load the class it fails... here is
> This is because the classes that are being developed in a workbench
> aren't on the classpath of the Eclipse plugin. It looks like you are
> trying to run code under development into the currently running Eclipse
> instance. This is very dangerous. You have no control over the code
> that is called in the classes that are loaded. For instance, if the
> code you are loading has a System.exit() call, it will cause Eclipse to
> exit without warning.
I am so new to eclipse I am not sure I know what your saying (I have used
it for less then 24 hrs).... that being said here is the cycle:
Start app (it opens a new instance of eclipse)
Run the test
close the new instance
Just to verify I was not doing what you said I added a main() to aef and a
system.exit() and no ill-effects
> If you need to run code that is being developed in a workbench, you
> should probably look into the launch support. This will allow you to
> launch a separate VM to run the code. That way your Eclipse instance
> will be protected from problem code. You should probably take a look at
> the JUnit plugins for running test cases. I'm guessing that these are
> close to what you are trying to do.
They are actually a head to head competitor of my product ;-)... I was
attempting registing this for intellectual honesty reasons (if there is
some non-testing example you can point me to that would ease my feelings
on the matter).... btw the description of launchers I saw makes very
little sense can you give me a 25 words or less explanation of what they
are in a non-eclipse context.
>> the method in question:
>>
>> package eclipse.views;
>>
>>
>> import java.util.List;
>>
>> import org.eclipse.jdt.core.IJavaElement;
>> import org.eclipse.jdt.core.IType;
>> import org.eclipse.jface.viewers.ISelection;
>> import org.eclipse.jface.viewers.IStructuredSelection;
>> import org.eclipse.swt.widgets.Composite;
>> import org.eclipse.ui.ISelectionListener;
>> import org.eclipse.ui.IWorkbenchPart;
>> import org.eclipse.ui.part.ViewPart;
>>
>> // all this is from my app (external to eclipse)
>> import dev.thistest.core.Event;
>> import dev.thistest.core.EventListener;
>> import dev.thistest.core.Result;
>> import dev.thistest.core.Settings;
>> import dev.thistest.core.TestSuite;
>> import dev.thistest.core.TestType;
>> import dev.thistest.ui.Loader;
>>
>> public class SampleView extends ViewPart implements ISelectionListener,
>> EventListener
>> {
>> public void testPerformed(Event event)
>> {
>> System.out.println(event);
>> }
>>
>> public void selectionChanged(IWorkbenchPart part, ISelection selection)
>> {
>> IStructuredSelection isel=(IStructuredSelection) selection;
>>
>> if(isel==null)
>> return;
>>
>> IJavaElement elem=(IJavaElement) isel.getFirstElement();
>>
>> if(elem==null)
>> return;
>>
>> IType itype=(IType) elem;
>>
>> if(!(elem instanceof IType))
>> return;
>>
>> String name=null;
>>
>> try {
>> if(!itype.getSuperclassName().equals("TestSuite"))
>> return;
>>
>> name=itype.getFullyQualifiedName();
>> } catch(Throwable e) {
>> e.printStackTrace();
>> }
>>
>> Settings.addSetting("TestType",TestType.All);
>> Settings.addSetting("EventListener",this);
>>
>> Class klass=null;
>>
>> try {
>> klass=this.getClass().getClassLoader().loadClass(name);
>> } catch(ClassNotFoundException e) {
>> }
>>
>> Object inst=null;
>>
>> System.out.println(klass);
>>
>> try {
>> inst=klass.newInstance();
>> } catch(InstantiationException e) {
>> } catch(IllegalAccessException e) {
>> }
>>
>> TestSuite theTest=(TestSuite) inst;
>>
>> toggleRun();
>> theTest.run();
>> testCount=(Integer) Settings.getSetting("TestCount");
>> toggleRun();
>>
>> theTest.run();
>> System.out.println(theTest.getResult());
>> }
>>
>> public void createPartControl(Composite parent)
>> {
>> getSite().getPage().addSelectionListener(this);
>> }
>>
>> public void setFocus()
>> {
>> }
>>
>> private void toggleRun()
>> {
>> Settings.addSetting("RunTest",!(Boolean) Settings.getSetting("RunTest"));
>> }
>>
>> private int testCount=0;
>> private List<TestSuite> tests;
>> }
>>
>> and when I attempt to load this class in a sub-eclipse instance get null
>> for the println when I click on the following class file:
>>
>> package arf;
>>
>> import dev.thistest.core.TestSuite;
>>
>> public class aef extends TestSuite
>> {
>> public void run()
>> {
>> System.out.println("hi there");
>> }
>>
>> }
>>
>> Note I have exported all the dev stuff in the MANIFEST and have set the
>> classpath in the test instance (it used to say class not found so I know
>> it finds it)
>>
|
|
|
Re: accessing classpath of workspace from plugin [message #243995 is a reply to message #243977] |
Mon, 24 December 2007 23:48   |
Eclipse User |
|
|
|
Originally posted by: wegener.cboenospam.com
Aryeh M. Friedman wrote:
> David Wegener wrote:
>
>
>> On Mon, 2007-12-24 at 17:09 +0000, Aryeh M. Friedman wrote:
>>> A plugin (view) that reads the class name selected in the package
>>> explorer (correctly) but when I go to actually load the class it
>>> fails... here is
>> This is because the classes that are being developed in a workbench
>> aren't on the classpath of the Eclipse plugin. It looks like you are
>> trying to run code under development into the currently running Eclipse
>> instance. This is very dangerous. You have no control over the code
>> that is called in the classes that are loaded. For instance, if the
>> code you are loading has a System.exit() call, it will cause Eclipse to
>> exit without warning.
>
> I am so new to eclipse I am not sure I know what your saying (I have
> used it for less then 24 hrs).... that being said here is the cycle:
>
> Start app (it opens a new instance of eclipse)
> Run the test
> close the new instance
>
I think it might help if you provide more details about what you are
trying to do. Since you use Eclipse to develop plugins for Eclipse you
can quickly get confused about what instance of Eclipse you are talking
about.
> Just to verify I was not doing what you said I added a main() to aef and
> a system.exit() and no ill-effects
>
This is because you aren't actually loading the aef class. It isn't on
the plugin's runtime class path so when you do the Class.forName() call
the class can't be found and is not loaded.
A given instance of Eclipse will only have access to the classes in the
plugins that make up that instance. If you create a new Java project in
a workspace, the classes that you add to the project are not part of the
running version of Eclipse and are not accessible.
When you are working on your plugin code, you are running one instance
of Eclipse. When you are ready to test your plugin, you launch a second
Eclipse instance that includes all of the base Eclipse plugins plus the
plugin you are working on. This second instance will have a separate
workspace and is refered to the runtime workspace. Each instance of
Eclipse runs in a separate VM.
It sounds like what you are doing is trying to create a Java project in
the runtime workspace. Your plugin wants to provide the ability to run
tests against this Java project. In order to do that, you need to
launch a third Java VM. This is what you would use a launcher. The
launcher is used to define the classpath, program arguments, and any
other run time environment information necessary to launch a separate VM.
Based on what you have written, I would guess that you need to launch
some type of test suite runner that takes the fully qualified name of
the selected test class. That test runner then creates an instance of
your test suite class and runs the tests.
>> If you need to run code that is being developed in a workbench, you
>> should probably look into the launch support. This will allow you to
>> launch a separate VM to run the code. That way your Eclipse instance
>> will be protected from problem code. You should probably take a look at
>> the JUnit plugins for running test cases. I'm guessing that these are
>> close to what you are trying to do.
>
> They are actually a head to head competitor of my product ;-)... I was
> attempting registing this for intellectual honesty reasons (if there is
> some non-testing example you can point me to that would ease my feelings
> on the matter).... btw the description of launchers I saw makes very
> little sense can you give me a 25 words or less explanation of what they
> are in a non-eclipse context.
>
A launcher runs an external program as a separate process. It contains
all the information necessary to run the program and gather results. It
is a way to isolate code that could corrupt your program if executed as
part of the same process.
If you don't want to look at the Junit plugins, you could try the jdt
plugins. The JDT provides the launch mechanism for java applications
and applets. In fact, you will probably need to use the facilities
provided by the org.eclipse.jdt.launching plugin. There are also some
articles on the Eclipse web site about launching applications. They are
in the Resources section. You can also search the Eclipse help for launch.
>
>
>>> the method in question:
>>>
>>> package eclipse.views;
>>>
>>>
>>> import java.util.List;
>>>
>>> import org.eclipse.jdt.core.IJavaElement;
>>> import org.eclipse.jdt.core.IType;
>>> import org.eclipse.jface.viewers.ISelection;
>>> import org.eclipse.jface.viewers.IStructuredSelection;
>>> import org.eclipse.swt.widgets.Composite;
>>> import org.eclipse.ui.ISelectionListener;
>>> import org.eclipse.ui.IWorkbenchPart;
>>> import org.eclipse.ui.part.ViewPart;
>>>
>>> // all this is from my app (external to eclipse)
>>> import dev.thistest.core.Event;
>>> import dev.thistest.core.EventListener;
>>> import dev.thistest.core.Result;
>>> import dev.thistest.core.Settings;
>>> import dev.thistest.core.TestSuite;
>>> import dev.thistest.core.TestType;
>>> import dev.thistest.ui.Loader;
>>>
>>> public class SampleView extends ViewPart implements
>>> ISelectionListener, EventListener
>>> {
>>> public void testPerformed(Event event) {
>>> System.out.println(event);
>>> }
>>>
>>> public void selectionChanged(IWorkbenchPart part, ISelection
>>> selection) {
>>> IStructuredSelection isel=(IStructuredSelection) selection;
>>>
>>> if(isel==null)
>>> return;
>>>
>>> IJavaElement elem=(IJavaElement) isel.getFirstElement();
>>>
>>> if(elem==null)
>>> return;
>>>
>>> IType itype=(IType) elem;
>>>
>>> if(!(elem instanceof IType))
>>> return;
>>>
>>> String name=null;
>>>
>>> try {
>>> if(!itype.getSuperclassName().equals("TestSuite"))
>>> return;
>>>
>>> name=itype.getFullyQualifiedName();
>>> } catch(Throwable e) {
>>> e.printStackTrace();
>>> }
>>>
>>> Settings.addSetting("TestType",TestType.All);
>>> Settings.addSetting("EventListener",this);
>>>
>>> Class klass=null;
>>>
>>> try {
>>> klass=this.getClass().getClassLoader().loadClass(name);
>>> } catch(ClassNotFoundException e) {
>>> }
>>>
>>> Object inst=null;
>>> System.out.println(klass);
>>> try {
>>> inst=klass.newInstance();
>>> } catch(InstantiationException e) {
>>> } catch(IllegalAccessException e) {
>>> }
>>>
>>> TestSuite theTest=(TestSuite) inst;
>>>
>>> toggleRun();
>>> theTest.run();
>>> testCount=(Integer) Settings.getSetting("TestCount");
>>> toggleRun();
>>>
>>> theTest.run();
>>> System.out.println(theTest.getResult());
>>> }
>>>
>>> public void createPartControl(Composite parent) {
>>> getSite().getPage().addSelectionListener(this);
>>> }
>>>
>>> public void setFocus() {
>>> }
>>>
>>> private void toggleRun()
>>> {
>>> Settings.addSetting("RunTest",!(Boolean)
>>> Settings.getSetting("RunTest"));
>>> }
>>>
>>> private int testCount=0;
>>> private List<TestSuite> tests;
>>> }
>>>
>>> and when I attempt to load this class in a sub-eclipse instance get
>>> null for the println when I click on the following class file:
>>>
>>> package arf;
>>>
>>> import dev.thistest.core.TestSuite;
>>>
>>> public class aef extends TestSuite
>>> {
>>> public void run()
>>> {
>>> System.out.println("hi there");
>>> }
>>>
>>> }
>>>
>>> Note I have exported all the dev stuff in the MANIFEST and have set
>>> the classpath in the test instance (it used to say class not found so
>>> I know it finds it)
>>>
>
>
|
|
|
Re: accessing classpath of workspace from plugin [message #244000 is a reply to message #243995] |
Tue, 25 December 2007 08:56  |
Eclipse User |
|
|
|
Originally posted by: aryeh.friedman.gmail.com
Note: I have replaced the code at the bottom with the current version...
the only goal was to get some kind of output from arg.aef which I do but I
am still confused on a few things:
1. How do I call an arbitrary method in the client class (i.e. the real
thing will almost never have a main() [at least in the context of
interest])
See below for more details. Please note a lot of this is thinking out
loud.
David Wegener wrote:
> Aryeh M. Friedman wrote:
>> David Wegener wrote:
>>
>>
>>> On Mon, 2007-12-24 at 17:09 +0000, Aryeh M. Friedman wrote:
>>>> A plugin (view) that reads the class name selected in the package
>>>> explorer (correctly) but when I go to actually load the class it
>>>> fails... here is
>>> This is because the classes that are being developed in a workbench
>>> aren't on the classpath of the Eclipse plugin. It looks like you are
>>> trying to run code under development into the currently running Eclipse
>>> instance. This is very dangerous. You have no control over the code
>>> that is called in the classes that are loaded. For instance, if the
>>> code you are loading has a System.exit() call, it will cause Eclipse to
>>> exit without warning.
>>
>> I am so new to eclipse I am not sure I know what your saying (I have
>> used it for less then 24 hrs).... that being said here is the cycle:
>>
>> Start app (it opens a new instance of eclipse)
>> Run the test
>> close the new instance
>>
> I think it might help if you provide more details about what you are
> trying to do. Since you use Eclipse to develop plugins for Eclipse you
> can quickly get confused about what instance of Eclipse you are talking
> about.
I am essentially attempting to duplicate JUnit's plugin (hopefully adding
some useful and new stuff along the way). The details:
1. I originally developed the testing framework as a standalone
application (and the core + cmdline + swing UI's still are) [note 1]
{http://www.flosoft-systems.com}
2. Several users asked me to include a eclipse plugin (as well a netbeans
one) so in light of needing to do some refactoring for an other set of
functionality I decided to add it to the next release.
3. Currently the cmdline and Swing versions take a lists of TestSuites to
run as command line args
4. The general design concept for the plugin is make it so after loading
it you can select form class in the package explorer and run it through my
application (for implementation reasons all valid classes subclass
TestSuite) [some may subclass TestSet but they can't be run directly]
5. I am currently using a view with a simple selection listener because
that is the only/simplest plugin wizard I found (i.e. I started with the
Hello, World example from the tutorial)... this is bad for a few reasons:
* It is bad to trigger a complex event by selecting a SourceFile (I
will expand it later to allow CompilationUnit's) [i.e. it violated the
principle of doing what ever is the least surprising])
* I want to give the user multiple ways to activate the plugin (the
results will either be in reusing the swing dialog from the swing version
[not the "right" solution]
Thus, I defenetly want to clean up the UI and such but due to
delivery deadlines will live with the above until sometime after New
Years. In the meantime how do I add new UI features to a plugin?
>> Just to verify I was not doing what you said I added a main() to aef and
>> a system.exit() and no ill-effects
>>
> This is because you aren't actually loading the aef class. It isn't on
> the plugin's runtime class path so when you do the Class.forName() call
> the class can't be found and is not loaded.
If I understand the code I did I just add what ever I want to the class
path via a setAttrib in the ILaunchConfigurationWorkingCopy (even though
after looking at the attribs avaible I don't see any related to class
paths)
New version:
package eclipse.views;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.debug.core.ILaunchManager;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.launching.IJavaLaunchConfigurationConstants;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.ISelectionListener;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.part.ViewPart;
public class ThisTestView extends ViewPart implements ISelectionListener
{
public void selectionChanged(IWorkbenchPart part, ISelection selection)
{
try {
IStructuredSelection isel=(IStructuredSelection) selection;
IJavaElement elem=(IJavaElement) isel.getFirstElement();
String
prjName=elem.getJavaProject().getProject().getDescription(). getName();
ILaunchConfigurationWorkingCopy
wc=DebugPlugin.getDefault().getLaunchManager().getLaunchConf igurationType(IJavaLaunchConfigurationConstants.ID_JAVA_APPL ICATION).newInstance(null,
"SampleConfig");
String cName=((IType) isel.getFirstElement()).getFullyQualifiedName();
wc.setAttribute(IJavaLaunchConfigurationConstants.ATTR_PROJE CT_NAME,
prjName);
wc.setAttribute(IJavaLaunchConfigurationConstants.ATTR_MAIN_ TYPE_NAME,
cName);
wc.doSave().launch(ILaunchManager.RUN_MODE, null);
} catch(Throwable e) {
System.out.println(e);
}
}
public void createPartControl(Composite parent)
{
getSite().getPage().addSelectionListener(this);
}
public void setFocus()
{
}
}
Sub-instance code:
package arf;
public class aef
{
public static void main(String[] args)
{
System.out.println("hello, world");
}
}
Notes:
1. No matter how good eclipse is I can't stand IDE's of any kind so the
mainstream development will stay command line
|
|
|
Goto Forum:
Current Time: Wed Jul 16 13:48:30 EDT 2025
Powered by FUDForum. Page generated in 0.12424 seconds
|